这段代码有效但在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>
一样写。
答案 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<
,因此如果您提供该运算符的实现,它将起作用。