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

如何向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:03