std::sort需要注意的问题(coredump)

本文通过一个具体的C++ STL排序示例,展示了不同自定义谓词函数如何影响排序结果及程序稳定性。特别是针对某些谓词可能导致的assert异常进行了详细解释,并深入探讨了STL源代码中的相关函数要求。

1.例子

  先举个例子:分析一下程序的运行结果:看看在三种情况下程序的输出分别是什么,有可能出现异常

  ////////////////////////////////////////////////////

  #pragma once

  #include

  #include

  ///////////////////////////////////////////////////

  /// 下面是三个自定义的谓词函数,排序算法将分别使用这三个函数

  //////////////////////////////////////////////////

  bool compare(int a,int b)

  {

      //a是vector靠后的参数,b是靠前的参数,如a=vector[1],b=vector[0]

  return a - b;

  }

  bool compare1(int a,int b)

  {

  return a < b;

  }

  bool compare2(int a,int b)

  {

  return a <= b;

  }

  /////////////////////////////////////////////////////

  ///Main 函数

  ////////////////////////////////////////////////////

  int main(int arg,char * argv[])

  {

  std::vector vec;

  vec.push_back(7);

  vec.push_back(5);

  vec.push_back(8);

  //第一种情况

  std::sort(vec.begin(),vec.end(),compare);

  //第二种情况

  std::sort(vec.begin(),vec.end(),compare1);

  //第三种情况

  std::sort(vec.begin(),vec.end(),compare2);

  getchar();

  return 0;

  }

  //////////////////////////////////////////////////

  2.结果

  三种情况在程序中分别使用后(这里为了节省空间写在了一起)的结果是:

  (1)第一种情况(compare函数)和第三种情况(compare2 函数)出现错误(assert):

  (2)第二种情况(compare1函数)下程序运行正常,结果正确。

  3.分析

  第一种情况和第三种情况出错的原因是:跟踪到出现异常的stl的源代码的一个函数中,就是下面这个函数:

  template inline

  bool __CLRCALL_OR_CDECL _Debug_lt_pred(_Pr _Pred, _Ty1& _Left, _Ty2& _Right,

  const wchar_t *_Where, unsigned int _Line)

  {    // test if _Pred(_Left, _Right)  and _Pred is strict weak ordering

  if (!_Pred (_Left, _Right))

  return (false);

  else if (_Pred(_Right, _Left))

  _DEBUG_ERROR2("invalid operator<", _Where, _Line);

  return (true);

  }

  这个函数要求对于调用的两个参数交换位置时不能得到相同的true的结果。也就是为什么第一种和第三种不行的原因了:A当待比较的两个值相等的时候,第三种情况和B当待比较的两个值不相等的时候,第一种情况。

  但是对于调用的两个参数交换位置时允许得到相同的false的结果,因为这时根本不进行两个参数交换位置操作!!(具体看程序:在第一个if的时候就返回false了)

 

应聘 C++ 岗位时,所需掌握的技术栈会根据具体岗位方向(如后端开发、游戏开发、嵌入式系统、高性能计算、音视频处理等)有所不同,但总体上可以分为 **核心 C++ 技术** 和 **相关领域技能** 两大类。 --- ### ✅ 一、核心 C++ 技术(必须掌握) #### 1. **C++ 语言基础** - 数据类型、运算符、控制结构 - 函数重载、默认参数、内联函数 - 指针与引用、动态内存管理(`new` / `delete`) - 数组、字符串处理(C 风格和 `std::string`) ```cpp #include <iostream> #include <string> int main() { std::string name = "Alice"; std::cout << "Hello, " << name << std::endl; return 0; } ``` > 上述代码展示了基本的输入输出和字符串使用,是 C++ 编程的基础。 #### 2. **面向对象编程(OOP)** - 类与对象、构造函数/析构函数 - 封装、继承、多态(虚函数、纯虚函数) - 运算符重载、友元函数 ```cpp class Animal { public: virtual void speak() = 0; // 纯虚函数 → 抽象类 virtual ~Animal() = default; }; class Dog : public Animal { public: void speak() override { std::cout << "Woof!" << std::endl; } }; ``` #### 3. **模板与泛型编程** - 函数模板、类模板 - STL 容器(`vector`, `list`, `map`, `set` 等) - 算法(`sort`, `find`, `transform` 等) - 迭代器使用 ```cpp #include <vector> #include <algorithm> #include <iostream> std::vector<int> nums = {5, 2, 8, 1}; std::sort(nums.begin(), nums.end()); for (int n : nums) std::cout << n << " "; ``` #### 4. **现代 C++ 特性(C++11/14/17/20)** - 智能指针:`unique_ptr`, `shared_ptr`, `weak_ptr` - 自动类型推导:`auto`, `decltype` - 范围 for 循环 - Lambda 表达式 - 右值引用与移动语义(`std::move`, `std::forward`) - 多线程支持:`std::thread`, `std::mutex`, `std::async` ```cpp #include <memory> #include <thread> #include <iostream> void task() { std::cout << "Running in thread\n"; } int main() { auto t = std::make_unique<std::thread>(task); t->join(); return 0; } ``` #### 5. **内存管理与性能优化** - RAII 原则 - 内存泄漏检测(Valgrind、AddressSanitizer) - 对象生命周期管理 - 零拷贝技术、缓存友好设计 --- ### ✅ 二、常用库与工具 | 工具/库 | 说明 | |--------|------| | **STL** | 标准模板库,必须熟练使用 | | **Boost** | 提供更高级功能(如智能指针早期版本、ASIO网络库) | | **Google Test / Catch2** | 单元测试框架 | | **CMake** | 构建系统,跨平台项目必备 | | **Git** | 版本控制 | | **GDB / LLDB** | 调试器 | | **Valgrind / AddressSanitizer** | 内存错误检测 | 示例 CMakeLists.txt: ```cmake cmake_minimum_required(VERSION 3.10) project(MyApp) set(CMAKE_CXX_STANDARD 17) add_executable(myapp main.cpp) ``` --- ### ✅ 三、按岗位方向扩展技能 #### 1. **后端开发 / 高性能服务** - 网络编程:TCP/UDP、Socket API、I/O 多路复用(`epoll`, `select`) - 并发编程:线程池、锁机制、无锁数据结构 - 框架:Boost.Asio、libevent、muduo(Linux 下常用) - 数据库接口:MySQL Connector/C++, SQLite - RPC 框架:gRPC(C++ 版)、Thrift #### 2. **游戏开发 / 图形引擎** - 游戏引擎:Unreal Engine(完全基于 C++) - 图形 API:OpenGL, Vulkan, DirectX - 数学库:GLM - 物理引擎:Bullet, Box2D #### 3. **嵌入式 / 实时系统** - RTOS(如 FreeRTOS、VxWorks) - 硬件交互、寄存器操作 - 低功耗、实时性要求高 - 不使用异常和 RTTI,禁用 STL 或部分使用 #### 4. **音视频处理 / 多媒体** - FFmpeg(C 接口,常配合 C++ 封装) - OpenCV(计算机视觉) - 音频处理:PortAudio, RtAudio #### 5. **高频交易 / 金融系统** - 极低延迟设计 - 锁-free 编程、内存池 - CPU 亲和性、缓存行对齐 --- ### ✅ 四、软技能与其他要求 - **算法与数据结构**:LeetCode 中等难度以上题目应能快速解决 - **操作系统知识**:进程/线程、虚拟内存、文件系统、信号量 - **计算机网络**:TCP/IP 协议栈、HTTP/HTTPS、WebSocket - **设计模式**:单例、工厂、观察者、策略、命令等 - **调试能力**:能看 core dump,使用 GDB 分析崩溃原因 --- ### ✅ 示例面试题准备方向 ```cpp // 实现一个线程安全的单例模式(C++11 后推荐方式) class Singleton { public: static Singleton& getInstance() { static Singleton instance; // 局部静态变量 → 线程安全 return instance; } private: Singleton() = default; ~Singleton() = default; Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; }; ``` --- ### 总结:应聘 C++ 岗位需要掌握的核心技术栈 | 类别 | 技术点 | |------|-------| | 语言核心 | C++11/14/17+, OOP, 模板, RAII, 移动语义 | | 标准库 | STL(容器、算法、迭代器)、智能指针 | | 系统级 | 多线程、锁、原子操作、内存模型 | | 开发工具 | CMake, Git, GDB, Valgrind | | 领域技能 | 网络编程 / 图形 / 嵌入式 / 音视频(依岗位而定) | | 软实力 | 算法题、系统设计、调试、沟通能力 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值