所以我有一个包含int
对的红黑树,当我调用.find(x)
函数时,它会搜索x
(第一和第二),但是我想让它忽略第二个值,并只查看第一个值。我怎么能这样做?
答案 0 :(得分:2)
一般情况下,这是不可能的。但是对于int
对的有限情况,您可以使用upper_bound()
和std::numeric_limits<int>::min()
伪造它:
#include <iostream>
#include <iomanip>
#include <limits>
#include <set>
int main()
{
using key_type = std::pair<int, int>;
std::set<key_type> s { {1, -1}, {1, 3}, {2, 10}, {3, 42} };
auto it = s.upper_bound (key_type (2, std::numeric_limits<int>::min ()));
std::cout << "(" << it->first << "; " << it->second << ")\n";
}
答案 1 :(得分:0)
auto fn = [](const pair<int, int>&a, const pair <int, int>&b) {
return a.first < b.first;
};
set<pair<int, int>, decltype(fn)> my_set(fn);
my_set 现在是一个只使用 pair.first
作为键的集合
示例:
#include <iostream>
#include <string>
#include <set>
using namespace std;
int main()
{
auto fn = [](const pair<int, int>&a, const pair <int, int>&b) {
return a.first < b.first;
};
set<pair<int, int>, decltype(fn)> my_set(fn);
my_set.insert({1, 123});
my_set.insert({4, 456});
my_set.insert({7, 789});
auto iter = my_set.find({4, 0});
if (iter != my_set.end()) {
cout << "first: " << iter->first << ", second: " << iter->second << "\n";
} else {
cout << "not found\n";
}
return 0;
}
印刷品
first: 4, second: 456
将 my_set
更改为仅 set<pair<int, int>> my_set;
,它将打印 not found
当然,仅在 first
上键入可以说是 map<int, int>
,那么为什么不直接这样做呢?