如何不使用全局变量向C++ STL sort的比较函数传入第二个vector
解决方案
STL std::sort 要求传入的比较器是仅接受两个待比较元素作为参数的可调用对象,你原本定义的fn多了一个v1参数,直接传入不符合接口要求。不需要全局变量的前提下,有两种常用实现方案:
方案1:使用Lambda表达式(C++11及以上版本推荐)
直接在sort调用处写匿名函数,通过捕获列表将v1传入比较器,推荐用const引用捕获避免不必要的vector拷贝:
// v1是作为排序依据的vector std::sort(v2.begin(), v2.end(), [&v1](int a, int b) { return v1[a] < v1[b]; });
这种写法最简洁,不需要额外定义函数或者类,日常开发优先选择。
方案2:使用函数对象(仿函数,兼容C++03及更早版本)
自定义一个结构体,将v1作为成员变量存储,重载()运算符实现比较逻辑:
// 自定义比较器结构体 struct CompareByV1 { const std::vector<int>& v1; CompareByV1(const std::vector<int>& vec) : v1(vec) {} bool operator()(int a, int b) const { return v1[a] < v1[b]; } }; // 调用sort的时候传入构造好的函数对象 std::sort(v2.begin(), v2.end(), CompareByV1(v1));
注意事项
- 两种方案都要保证
v1的生命周期覆盖整个std::sort的执行过程,排序过程中不要修改或释放v1 - 比较逻辑要严格满足严格弱序要求,不要添加
<=等包含相等情况的判断,否则会触发未定义行为
内容的提问来源于stack exchange,提问作者amalp12
相关产品推荐
相关产品推荐

