std :: set <pair <int,int>&gt; - 仅使用pair&lt;&gt; :: first作为键</pair <int,int>

时间:2015-01-17 22:56:46

标签: c++ find set

所以我有一个包含int对的红黑树,当我调用.find(x)函数时,它会搜索x(第一和第二),但是我想让它忽略第二个值,并只查看第一个值。我怎么能这样做?

2 个答案:

答案 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";
}

Live on Coliru

答案 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>,那么为什么不直接这样做呢?