std::find 是否对 std::vector<std::p air<T、T>> 使用运算符==?

Does std::find use operator== for std::vector<std::pair<T, T>>?

提问人:sarzynek 提问时间:1/25/2023 更新时间:2/16/2023 访问量:32

问:

我尝试为 std::p air<int, int 重载 operator==>以便只有对的第一个元素才重要。然后,我想使用 std::find 在 std::vector<std::p air<int, int>> 中查找特定元素,使用重载运算符 ==。但是,似乎 std::find 没有使用我的重载运算符 ==,尽管它在一个简单的比较语句中工作。

我希望输出以下代码: 1 1 1

但我得到: 1 1 0

在 Linux 上运行,gcc 11.3:

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

using namespace std;

typedef pair<int, int> p_int_t;

bool operator==(const p_int_t& p1, const p_int_t& p2)
{
    return p1.first == p2.first;
}

int main()
{
    vector<p_int_t> v;

    v.push_back({1, 2});
    v.push_back({1, 3});

    p_int_t p(1, 4);

        cout << (v[0] == p) << endl;
    cout << (v[1] == p) << endl;

        cout << (find(v.begin(), v.end(), p) != v.end()) << endl;

    return 0;
}
迭代器 查找 std 运算符-关键字 谓词

评论


答:

0赞 Michaël Roy 2/16/2023 #1

编译器不会选择独立比较运算符,因为 p_int_t 类型是别名,并且它没有在 std 命名空间中像 std:: pair 那样定义。换句话说,编译器正在寻找具有此签名的运算符:,并在 中找到它。std::operator==(const std::pair<int, int>&, const std::pair<int, int>&);algorithm

您可以在 std 命名空间中声明运算符,这有效,但不推荐使用,或者将 p_int_t 定义为一个类,如下所示:

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

using namespace std;

struct p_int_t : pair<int, int> {

    using pair<int, int>::pair;   // for c++=11 and later

    p_int_t() : pair() {}                 // for c++98
    p_int_t(int x, int y) : pair(x, y) {} // for c++98

    friend bool operator==(const p_int_t& p1, const p_int_t& p2) {
        return p1.first == p2.first;
    }
};

int main() {
    vector<p_int_t> v;

    v.push_back({1, 2});
    v.push_back({1, 3});

    p_int_t p(1, 4);

    cout << (v[0] == p) << endl;
    cout << (v[1] == p) << endl;

    cout << (find(v.begin(), v.end(), p) != v.end()) << endl;

    return 0;
}

代码可以在这里找到:https://godbolt.org/z/5dfPaaoMz

必须重新定义构造函数非常麻烦,但您也可以使用 std::find_if(),如下所示:

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

using namespace std;

typedef pair<int, int> p_int_t;

struct compare_first {
    p_int_t p;

    compare_first(p_int_t x) : p(x) {}
    bool operator()(const p_int_t& x) { return x.first == p.first; }
};

int main() {
    vector<p_int_t> v;

    v.push_back({1, 2});
    v.push_back({1, 3});

    p_int_t p(1, 4);

    cout << (find_if(v.begin(), v.end(), compare_first(p)) != v.end()) << endl;

    // or for c++11 or later...

    cout << (find_if(v.begin(), v.end(), [&p](const p_int_t& x) { return p.first == x.first; }) != v.end()) << endl;
     

    return 0;
}

此处代码:https://godbolt.org/z/r87hdrrK9