C ++ std :: set查找函数重载==运算符

时间:2012-08-23 07:44:16

标签: c++ set stdset

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

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

以下是结构的代码:

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删除它。有没有干净的方法或已有的数据结构来做到这一点?

3 个答案:

答案 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的两个实例。