【发布时间】:2018-09-03 17:16:39
【问题描述】:
我有一个向量,其中包含同一类的多个对象。我试图遍历向量并将每个对象与一个给定对象进行比较,如果它们相同,则返回该对象向量中的位置。我该怎么办?
例如我想在包含 [foo1, foo2, foo3, foo4] 的向量中查找对象 foo3
【问题讨论】:
标签: c++
我有一个向量,其中包含同一类的多个对象。我试图遍历向量并将每个对象与一个给定对象进行比较,如果它们相同,则返回该对象向量中的位置。我该怎么办?
例如我想在包含 [foo1, foo2, foo3, foo4] 的向量中查找对象 foo3
【问题讨论】:
标签: c++
您可以重载 == 运算符,然后在比较对象时使用它,就好像它们是 C++ 内置类型之一:
// Overload == for myclass
bool operator==(const myclass& a, const myclass& b) {
return ...; // true if a is the same as b; false otherwise
}
现在你可以这样做了:
myclass toFind = ...
std::vector<myclass> items = ...
for (int i = 0 ; i != items.size() ; i++) {
if (items[i] == toFind) {
cout << "Item is found at index " << i << endl;
}
}
您还可以使用标准 C++ 库中内置的其他搜索工具。它正常运行的关键是正确重载== 运算符。
【讨论】:
std::vector<myclass> 复制您的对象。一旦一个对象在向量中,它在内存中就是一个不同的对象,所以你可以做的只是比较属性,除非你存储指针。如果您确实存储指针,无论是普通指针还是“智能”指针,您只需要确定两个对象是否相同,只需将它们的指针与 == 运算符进行比较。
您可以为对象重载等号运算符...这样您就可以将它们作为普通的内置类型进行比较。 之后就可以使用 std::find 函数了
【讨论】:
在为您的班级重载== 后使用std::find
auto it = std::find( vec.begin () , vec.end() , obj ); //eg. obj = foo3
获取位置:
int pos = -1;
if( it != vec.end() )
pos = it - vec.begin () ;
【讨论】:
我遇到了类似的问题,将对象/结构转换为字符列表。
参考:
(char*)&reference1 == (char*)&reference2
指针:
(char*)pointer1 == (char*)pointer2
它们也可以混在一起:
(char*)pointer1 == (char*)&reference2
【讨论】: