c++ - 集合的结构之间的比较

标签 c++ set c++14 smart-pointers

此代码有效,但有一个名为 ptrcomp 的结构外面weighted_pointer似乎(对我而言)它们是不同的东西。我尝试了一些不同的方法,甚至用谷歌搜索,但我还没有找到像这样工作的东西。

struct node{
    unsigned int oper;
    void * a;
    void * b;
};

struct weighted_pointer{
    mutable int weight;
    unique_ptr<node> pointer;
};

struct ptrcomp{
    bool operator()(const weighted_pointer & lhs, const weighted_pointer & rhs) {
        return tie(lhs.pointer->oper, lhs.pointer->a, lhs.pointer->b) < tie(rhs.pointer->oper, rhs.pointer->a, rhs.pointer->b);
    }
};

set<weighted_pointer,ptrcomp> gate;

我的目标是制作 std::set在职的。并且可能写成 set<weighted_pointer> .

最佳答案

having a struct called ptrcomp outside the weighted_pointer seems (to me) that they are different things.

事情就是这样。 weighted_pointer是数据,而 ptrcomp是一种比较数据的方法。所以,这两个确实是不同的东西,您的代码没有任何问题。

如果您碰巧有一种比较数据的规范方法,请将其放入 operator < 中:

bool operator < (const weighted_pointer & lhs, const weighted_pointer & rhs) {
    return tie(lhs.pointer->oper, lhs.pointer->a, lhs.pointer->b) < tie(rhs.pointer->oper, rhs.pointer->a, rhs.pointer->b);
}

std::set如果您将其用作 std::set<weighted_pointer>,我们会很高兴地使用它(事实上​​,std::set 的第二个模板参数默认为 std::less<T> ,这是一个使用 operator < 的比较器类)。

关于c++ - 集合的结构之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31859340/

相关文章:

c++ - 带有 DirectX 部分的 Metro 风格应用程序

Ruby 设置类 : equality of sets

algorithm - 在 Haskell 中快速获取大小为 N 的所有子集

python - 将集合转换为列表时出现参数错误

c++ - 迭代器上是否有一个 STL 适配器为每个集合元素调用回调?

c++ - 对象和数据成员内存地址困惑

c++ - 如何有效地计算整个像素着色器阶段使用颜色的次数?

c++ - boost_1_60_0 .zip 在 Windows 中的安装

c++ - std::array 的嵌套聚合初始化

c++ - 具有 C++14 返回类型推导的 SFINAE