8

我正在使用套装。我使用自定义结构作为键。我正在插入一个值并试图找到插入的值。但它似乎永远找不到元素。

我已经覆盖了 == 运算符和 < 运算符。

这是结构的代码:

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());
}

它总是在断言语句中失败。我究竟做错了什么?

编辑-好的,现在我知道它根本不使用 == 运算符。这就是我想要的。我需要按距离排序的数据结构。但我应该可以使用 id 将其删除。是否有任何干净的方法或已经存在的数据结构来做到这一点?

4

3 回答 3

8

它失败了,因为您的小于比较使用distance_t::distance了您没有设置的findDistance

distance_t findDistance;
findDistance.id = 1;

std::setoperator==用于任何事情。它只使用operator<. 所以你必须改变它的逻辑来使用distance_t::id.

如果要在id不更改集合顺序的情况下进行搜索,可以使用std::find

set<distance_t>::iterator it = std::find(currentSet.begin(), 
                                         currentSet.end(), 
                                         findDistance);

这将使用您的operator==. 请记住,这具有线性时间复杂度。

于 2012-08-23T07:46:33.697 回答
4

因为operator==根本没有被调用。比较元素就像:

!(a < b) && !(b < a)

换句话说,它使用operator<.

于 2012-08-23T07:49:17.700 回答
1

由于您没有findDistance.distance为小于的结果分配值,因此比较未定义。

请注意,您对相等运算符和小于比较运算符的定义是危险的,因为很容易定义distance_t其结果不一致的实例。一个例子是两个距离相同但 ID 不同的实例。

于 2012-08-23T07:49:57.547 回答