std::set
是 C++ 标准库中的一个关联容器,它包含一组唯一的对象。std::set
中的元素自动按键排序,这里的“键”是指元素类型的某个成员。对于 std::pair<int, int>
类型的元素,std::set
默认会使用整个 pair
对象来进行排序和查找。
如果你想要 std::set
仅使用 pair
的 first
成员作为关键字进行查找,你可以提供一个自定义的比较函数或者重载 pair
的 <
运算符。以下是两种实现方式:
#include <iostream>
#include <set>
struct PairCompare {
bool operator()(const std::pair<int, int>& lhs, const std::pair<int, int>& rhs) const {
return lhs.first < rhs.first;
}
};
int main() {
std::set<std::pair<int, int>, PairCompare> s;
s.insert(std::make_pair(1, 2));
s.insert(std::make_pair(3, 4));
s.insert(std::make_pair(1, 5));
// 查找
auto it = s.find(std::make_pair(1, 0));
if (it != s.end()) {
std::cout << "Found: (" << it->first << ", " << it->second << ")\n";
} else {
std::cout << "Not found\n";
}
return 0;
}
在这个例子中,我们定义了一个 PairCompare
结构体,它重载了 ()
运算符来比较两个 pair
的 first
成员。然后我们在创建 std::set
时将 PairCompare
作为第二个模板参数传入。
pair
的 <
运算符#include <iostream>
#include <set>
namespace std {
template <>
struct less<pair<int, int>> {
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) const {
return lhs.first < rhs.first;
}
};
}
int main() {
std::set<std::pair<int, int>> s;
s.insert(std::make_pair(1, 2));
s.insert(std::make_pair(3, 4));
s.insert(std::make_pair(1, 5));
// 查找
auto it = s.find(std::make_pair(1, 0));
if (it != s.end()) {
std::cout << "Found: (" << it->first << ", " << it->second << ")\n";
} else {
std::cout << "Not found\n";
}
return 0;
}
在这个例子中,我们在 std
命名空间中特化了 less<pair<int, int>>
模板,重载了 <
运算符来仅比较 pair
的 first
成员。
这种仅使用 pair
的 first
成员作为关键字的 std::set
可以用于多种场景,例如:
first
成员)来快速查找、插入和删除元素时。如果你在使用上述方法时遇到了问题,比如编译错误或者运行时错误,请确保:
<
运算符逻辑正确。std::set
的比较逻辑。如果问题依然存在,请提供具体的错误信息,以便进一步诊断问题所在。
领取专属 10元无门槛券
手把手带您无忧上云