operator ==和vector confusion

时间:2012-09-30 07:14:05

标签: c++

我在向量中保存对象时遇到了一些麻烦,我想我需要对运算符做些什么。

std::vector<Foo> vec;
Foo a = Foo();
vec.push_back(a);

...

if(std::find(vec.begin(), vec.end(), a) < vec.end()) {
    // Found
} else {
    // Not found
}

Foo需要operator ==编译,我这样做

bool Foo::operator==(const Foo& rhs) {
    return this == &rhs;
}

但据我所知,vec.push_back将会复制Foo对象,所以我的==将返回false。

因此,每当我进行搜索时,都找不到它。

在这里做什么是正确的?我希望避免切换到指针向量。

3 个答案:

答案 0 :(得分:2)

更改Foo::operator==的实现以比较Foo的成员变量是否相等而不是检查身份。例如:

bool Foo::operator==(const Foo& rhs) const {
    return get_a() == rhs.get_a()
        && get_b() == rhs.get_b(); // and so on
}

请注意,这也可以是const函数,因为它不应修改任何成员变量,并且应该可以在Foo的const个实例上使用。

答案 1 :(得分:1)

你真的无能为力,std :: vector&lt;&gt; (或者说大多数标准容器)在插入时复制。如果两个Foo对象的相等性实际上是由它们的地址相等而定义的,那么你唯一能做的就是在std :: vector&lt;&gt;中存储指针。如果你想在std :: vector&lt;&gt;中存储指针我建议存储智能指针,如std :: shared_ptr&lt;&gt ;,std :: unique_ptr&lt;&gt;。

如果Foo太重而无法复制,你可以在C ++ 11中制作Foo Move-only,或者只能在C ++ 03中使用boost :: containers :: vector和boost :: move。

可能更容易更改operator ==()来比较成员变量。

答案 2 :(得分:1)

你的operator==暗示身份是由它在内存中的位置定义的,但是你将值附加到向量并希望相等的事实表明身份不是由位置定义的。

如果由于某种原因您没有基于任何其他成员的身份定义,您可以为Foo对象添加唯一标识符,可以在您的代码中比较该标识符:

bool operator==(const Foo &rhs)
{
    return this->m_id == rhs.m_id;
}