一组结构之间的比较

时间:2015-08-06 15:06:39

标签: 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>一样写。

3 个答案:

答案 0 :(得分:4)

  

在weighted_pointer之外有一个名为ptrcomp的结构对我来说似乎是不同的东西。

事情的确如此。 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 <)。

答案 1 :(得分:2)

如果您将代码更改为

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

    bool operator < (const weighted_pointer & rhs) const;
};

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

然后它会起作用,您不需要ptrcomp的比较器set,并且可以根据需要使用set<weighted_pointer>类型。 (如果愿意,您也可以将定义移动到结构中。)

答案 2 :(得分:1)

struct weighted_pointer {
 // ...
 struct compare {
  // ...
  };
};


set<weighted_pointer,weighted_pointer::compare> gate;

// better

using weighted_pointer_set = set<weighted_pointer,weighted_pointer::compare>;
weighted_pointer_set gate;

这就是我通常所做的事情。

拥有std::set<weighted_pointer>意味着该集合使用std::less来比较元素。这又会在相应的类型上调用operator<,因此如果您提供该运算符的实现,它将起作用。