C++含对象的vector是否可以使用find遍历?如何查找该对象?

有个程序简化下来大概是这样:

#include <algorithm>
#include <iostream>
#include <vector>

struct A {
    int x;
    int y;
};

int main() {
    A a, b, c, d;
    std::vector<A> vec_to_iter = {a, c, d};
    
    bool ans = std::find(vec_to_iter.begin(), vec_to_iter.end(), b);

    return 0;
}

当然这是错的:
image.png
程序目的是判断某个对象比如 b 是否在 vec_to_tier 中,不知道可不可以使用vector自带的迭代器来判断?


改了一下,不过还有报错:

#include <algorithm>
#include <iostream>
#include <ostream>
#include <vector>

struct A {
    int x;
    int y;
};

int main() {
    const A a{ 2,2 }, b{ 3,3 }, c{ 1,3 }, d{ 1,1 };
    std::vector<A> vec_to_iter = { a, c, d };
    
    bool ans = std::find(vec_to_iter.begin(), vec_to_iter.end(), b) != vec_to_iter.end();

    std::cout << ans << std::endl;
    return 0;
}

image.png
image.png
clang++给我报出来的是 const A 不能和 A== 的判断。

阅读 2.5k
2 个回答

std::find 返回的是 iterator ,指向找到的元素。

可以用 bool ans = std::find(vec_to_iter.begin(), vec_to_iter.end(), b) != vec_to_iter.end(); 得到一个 bool。


std::find 是用 operator== 来比较的。现在并没有提供 operator==,得增加一个,比如:

struct A {
    int x;
    int y;
    bool operator==(const A& other)const {
        return x == other.x && y == other.y;
    }
};

为 A 定义 == 运算符

bool operator == (const A& one, const A& other) {
    return one.x == other.x && one.y == other.y;
}

只要 x 和 y 都相等就能找到(所以找 b,实际找到的不一定是 b)。实际上,在把 a, c, d 放入 vec_to_iter 的时候,vector 里面就已经是新的对象复本了,可以这样检查

cout << &a << ", " << vec_to_iter.data() << endl;
// 或者
cout << &a << ", " << &vec_to_iter.front() << endl;

你会发现 a 的地址和 vec_to_iter 中第一个元素的地址并不相同,说明它们已经不是同一个对象了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏