1

我在将对象保存在向量中时遇到了一些麻烦,我想我需要对操作员做点什么。

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。

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

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

4

3 回答 3

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函数,因为它不应该修改任何成员变量并且应该可以在constFoo 的实例上使用。

于 2012-09-30T07:18:20.333 回答
1

你真的无能为力, std::vector<> (或者更确切地说是大多数标准容器)在插入时制作副本。如果两个 Foo 对象的相等性实际上是由它们的地址相等来定义的,那么您唯一能做的就是将指针存储在 std::vector<> 中。如果您想将指针存储在 std::vector<> 中,我建议存储智能指针,而不是像 std::shared_ptr<>、std::unique_ptr<>。

如果 Foo 太重而无法复制,您可以在 C++11 中使 Foo 仅移动,或者您可以使用 boost::containers::vector 和 boost::move 使其仅在 C++03 中移动。

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

于 2012-09-30T07:22:56.617 回答
1

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

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

bool operator==(const Foo &rhs)
{
    return this->m_id == rhs.m_id;
}
于 2012-09-30T07:29:02.690 回答