如何向std::set的Compare比较仿函数传递外部数据?
可行实现方案
你原本的结构体A的设计思路是可行的,只需要补充两处细节就能正常运行,调整后的代码如下:
#include <set> #include <vector> #include <cstdio> using namespace std; struct A { A(initializer_list<float> init) : v(init), s(Less(v)) { for(size_t i = 0; i < init.size(); ++i) { s.insert(i); } } struct Less { Less(const vector<float>& v) : v(v) {}; bool operator()(size_t i, size_t j) const { return v[i] < v[j]; } const vector<float>& v; }; vector<float> v; set<size_t, Less> s; }; int main() { A a = {3., 1., 2.}; for (size_t idx : a.s) { printf("%zu: %.1f\n", idx, a.v[idx]); } // 输出结果: // 1: 1.0 // 2: 2.0 // 0: 3.0 }
修改说明
std::set支持构造时传入已初始化的比较器实例,不需要比较器类型提供默认构造函数,你原本的代码就是缺少了给s传入绑定了当前对象v的Less实例这一步- 标准库要求比较器的
operator()必须是const可调用的,所以需要给方法加上const修饰符 - 你当前的代码结构里
v作为类成员先于s构造、晚于s析构,生命周期完全覆盖s,不会出现比较器里引用悬垂的问题,完全符合你的需求。 - 如果你的实际业务中用的不是
std::set,只要是支持传入有状态比较器的容器或算法,这个思路都可以直接复用。
内容的提问来源于stack exchange,提问作者atb
相关产品推荐
相关产品推荐

