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回答更新。我本来只想做一些微小的改变,但这是一个很好的观点。