提问人:sarzynek 提问时间:1/25/2023 更新时间:2/16/2023 访问量:32
std::find 是否对 std::vector<std::p air<T、T>> 使用运算符==?
Does std::find use operator== for std::vector<std::pair<T, T>>?
问:
我尝试为 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;
}
答:
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;
}
评论