我正在使用套装。我使用自定义结构作为键。我正在插入一个值并尝试查找插入的值。但它似乎永远找不到元素。
我已经覆盖了==运算符和<操作
以下是结构的代码:
struct distance_t
{
public:
int id;
double distance;
bool operator<(const distance_t& rhs) const
{
if(distance < rhs.distance)
return true;
else
return false;
}
bool operator==( const distance_t& rhs)
{
if(id == rhs.id)
return true;
else
return false;
}
};
这是主要的代码
int main()
{
set<distance_t> currentSet;
distance_t insertDistance;
insertDistance.id =1;
insertDistance.distance = 0.5;
currentSet.insert(insertDistance);
distance_t findDistance;
findDistance.id = 1;
assert(currentSet.find(findDistance) != currentSet.end());
}
断言语句总是失败。我做错了什么?
编辑-Ok现在我明白它根本不使用==运算符。这就是我想要的。我需要按距离排序数据结构。但我应该能够使用id删除它。有没有干净的方法或已有的数据结构来做到这一点?
答案 0 :(得分:8)
它失败了,因为您使用distance_t::distance
进行了小于比较,而您未在findDistance
中进行设置:
distance_t findDistance;
findDistance.id = 1;
std::set不会将operator==
用于任何事情。它只使用operator<
。所以你必须改变它的逻辑才能使用distance_t::id
。
如果您想按id
进行搜索而不更改订单的排序,可以使用std::find:
set<distance_t>::iterator it = std::find(currentSet.begin(),
currentSet.end(),
findDistance);
这将使用您的operator==
。请记住,这具有线性时间复杂度。
答案 1 :(得分:4)
因为根本没有调用operator==
。比较元素如:
!(a < b) && !(b < a)
换句话说,它使用operator<
。
答案 2 :(得分:1)
由于您尚未为findDistance.distance
分配值,因此未比较的结果为未定义。
请注意,您对等于和较少比较运算符的定义是危险的,因为很容易定义distance_t
的结果不一致的实例。一个例子是具有相同距离但不同id的两个实例。