【发布时间】:2019-08-21 21:02:52
【问题描述】:
我知道我必须为 std::set 重载运算符
我用两个类重载运算符 this->unique_id_a_ == t.unique_id_a_。
然后我将相同的元素放入两个集合中。 最后我在集合中找到了一个元素。 一组可以找到,另一组找不到。 这个问题让我困惑了很久。
struct UniqueID {
uint64_t unique_id_a_{0};
uint64_t unique_id_b_{0};
bool operator<(const UniqueID &t) const {
if (this->unique_id_a_ < t.unique_id_a_) {
return true;
}
if (this->unique_id_a_ == t.unique_id_a_ &&
this->unique_id_b_ < t.unique_id_b_) {
return true;
}
return false;
}
};
struct UniqueIDWithBug {
uint64_t unique_id_a_{0};
uint64_t unique_id_b_{0};
bool operator<(const UniqueIDWithBug &t) const {
if (this->unique_id_a_ < t.unique_id_a_) {
return true;
}
return (this->unique_id_b_ < t.unique_id_b_);
}
};
// init data
std::set<UniqueID> _set = {
{17303934402126834534u, 2922971136},
{8520106912500150839u, 3118989312},
{9527597377742531532u, 2171470080},
{10912468396223017462u, 3972792320},
};
std::set<UniqueIDWithBug> _set_with_bug = {
{17303934402126834534u, 2922971136},
{8520106912500150839u, 3118989312},
{9527597377742531532u, 2171470080},
{10912468396223017462u, 3972792320}};
UniqueID _unique_id = {10912468396223017462u, 3972792320};
UniqueIDWithBug _unique_id_with_bug = {10912468396223017462u, 3972792320};
if (_set.find(_unique_id) == _set.end()) {
std::cout << "_set not find" << std::endl;
}
if (_set_with_bug.find(_unique_id_with_bug) == _set_with_bug.end()) {
std::cout << "_set_with_bug not find" << std::endl;
}
输出: _set_with_bug 找不到
【问题讨论】:
-
是的,
UniqueIDWithBug是错误的。那你到底在问什么。你的问题缺少一些基本的东西。那将是一个实际的、具体的问题。 -
我很困惑为什么 UniqueIDWithBug 是错误的,我认为 operator
-
跟踪并比较
UniqueIDWithBug a{1, 10}和UniqueIDWithBug b{2,5}。执行a < b和b < a都返回true。那么如何定义排序呢? -
考虑使用
unordered_set? -
std::tie使正确执行此操作变得容易得多。return std::tie(unique_id_a_, unique_id_b_) < std::tie(t.unique_id_a_, t.unique_id_b_);是您在operator<中所需要的全部。想象一下扩展您的正确版本以手动处理 4 个变量。
标签: c++ algorithm sorting set std