You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用全局变量向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:45:03