C++ STL深入解析:仿函数与谓词的使用技巧
STL 与函数对象函数对象Functor是重载了operator()的类实例支持函数式调用。谓词Predicate是返回bool的函数对象分为一元谓词单参数和二元谓词双参数常用于 STL 算法的条件判断如排序、查找。STL 内建函数对象位于functional头文件分为三类算术仿函数如plusT,minusT,multipliesT用于数值运算。关系仿函数如equal_toT,greaterT用于比较操作。逻辑仿函数如logical_andT,logical_notT用于布尔逻辑组合。Lambda 与闭包Lambda 表达式C11提供匿名函数功能语法简洁支持捕获外部变量闭包。示例auto lambda [](int x) { return x 0; }; // 捕获外部变量可添加 [] 或 []闭包使 Lambda 能保留上下文状态适用于回调、异步编程等场景。std::bind 函数适配用于参数绑定和函数适配但现代 C 更推荐 Lambdaauto bound_func std::bind(original_func, arg1, std::placeholders::_1);Lambda 替代优势可读性高、调试方便、性能更优。volatile 关键字仅禁止编译器优化强制从内存读取变量适用于硬件寄存器访问中断处理嵌入式开发注意不解决多线程问题需用std::atomic或锁。内存资源管理栈内存自动管理局部变量。堆内存手动管理new/delete或malloc/free。智能指针优先使用std::unique_ptr,std::shared_ptr实现 RAII。new/delete 与 malloc/free 区别特性new/deletemalloc/free调用构造/析构函数是否类型安全是否返回void*适用语言CC不可重入函数因依赖全局/静态变量或共享资源在并发环境下可能导致数据竞争。解决方案使用局部变量或线程局部存储TLS。避免静态缓冲区改用可重入版本如strtok_r。多线程中通过锁或原子操作保护共享状态。代码示例谓词与 Lambda// 使用内建谓词排序 std::vectorint vec {3, 1, 4}; std::sort(vec.begin(), vec.end(), std::greaterint()); // Lambda 替代自定义谓词 std::sort(vec.begin(), vec.end(), [](int a, int b) { return a % 2 b % 2; });