集合的结构之间的比较
Comparsion between structs for a set
此代码有效,但在 weighted_pointer
之外有一个名为 ptrcomp
的结构(对我而言)似乎它们是不同的东西。我尝试了一些不同的方法,甚至用谷歌搜索,但我还没有找到像这样工作的东西。
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;
我的 objective 是为了让 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 <
).
的比较器 class
如果您将代码更改为
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);
}
然后它将起作用,并且您不需要 set
的比较器 ptrcomp
,并且可以根据需要使用类型 set<weighted_pointer>
。 (如果愿意,您也可以将定义移动到结构中。)
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<
,因此如果您提供该运算符的实现,它将起作用。
此代码有效,但在 weighted_pointer
之外有一个名为 ptrcomp
的结构(对我而言)似乎它们是不同的东西。我尝试了一些不同的方法,甚至用谷歌搜索,但我还没有找到像这样工作的东西。
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;
我的 objective 是为了让 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 <
).
如果您将代码更改为
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);
}
然后它将起作用,并且您不需要 set
的比较器 ptrcomp
,并且可以根据需要使用类型 set<weighted_pointer>
。 (如果愿意,您也可以将定义移动到结构中。)
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<
,因此如果您提供该运算符的实现,它将起作用。