【问题标题】:How to check if two objects are identical如何检查两个对象是否相同
【发布时间】:2018-09-03 17:16:39
【问题描述】:

我有一个向量,其中包含同一类的多个对象。我试图遍历向量并将每个对象与一个给定对象进行比较,如果它们相同,则返回该对象向量中的位置。我该怎么办?

例如我想在包含 [foo1, foo2, foo3, foo4] 的向量中查找对象 foo3

【问题讨论】:

标签: c++


【解决方案1】:

您可以重载 == 运算符,然后在比较对象时使用它,就好像它们是 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++ 库中内置的其他搜索工具。它正常运行的关键是正确重载== 运算符。

【讨论】:

  • 重载 == 运算符时,我是否必须明确说明它们相等的情况?因为我可能有两个具有相同属性但又是不同对象的对象。
  • @BenMcAlindin std::vector&lt;myclass&gt; 复制您的对象。一旦一个对象在向量中,它在内存中就是一个不同的对象,所以你可以做的只是比较属性,除非你存储指针。如果您确实存储指针,无论是普通指针还是“智能”指针,您只需要确定两个对象是否相同,只需将它们的指针与 == 运算符进行比较。
【解决方案2】:

您可以为对象重载等号运算符...这样您就可以将它们作为普通的内置类型进行比较。 之后就可以使用 std::find 函数了

【讨论】:

    【解决方案3】:

    在为您的班级重载== 后使用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 () ;
    

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,将对象/结构转换为字符列表。

      参考:

      (char*)&reference1 == (char*)&reference2
      

      指针:

      (char*)pointer1 == (char*)pointer2
      

      它们也可以混在一起:

      (char*)pointer1 == (char*)&reference2
      

      【讨论】:

        猜你喜欢
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多