C++ 运算符==和向量混淆

C++ 运算符==和向量混淆,c++,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 } 但据我所知,vec.push_back将创建Foo对象的副本,因此my==将返回false 因此,每

我在保持向量中的对象时遇到了一些问题,我想我需要对操作符做些什么

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
}
但据我所知,
vec.push_back
将创建Foo对象的副本,因此my==将返回false

因此,每当我开始搜索时,它总是找不到


在这里应该做什么?我希望避免切换到指针向量。

更改
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
实例上使用。

更改
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
实例上使用。

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

如果Foo太重而无法复制,则可以仅在C++11中移动Foo,也可以使用boost::containers::vector和boost::Move仅在C++03中移动Foo


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

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

如果Foo太重而无法复制,则可以仅在C++11中移动Foo,也可以使用boost::containers::vector和boost::Move仅在C++03中移动Foo


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

您的
运算符==
意味着标识是由其在内存中的位置定义的,但您将值附加到向量并希望相等的事实表明标识不是由位置定义的

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

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

您的
运算符==
意味着标识是由其在内存中的位置定义的,但您将值附加到向量并希望相等的事实表明标识不是由位置定义的

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

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

您是否可以编写
operator==()
来处理Foo中的数据而不是指针?您是否可以编写
operator==()
来处理Foo中的数据而不是指针?如果该运算符是常量,则该运算符会更好。@BenjaminLindley答案已更新。“我本来只想做最小的修改,但这是一个很好的观点。如果是常量,该运算符会更好。”BenjaminLindley回答更新。我本来只想做一些微小的改变,但这是一个很好的观点。