如何订购set <pair <unsigned int,=“”double =“”>&gt;通过对的第二个值?</pair <unsigned>

时间:2012-03-24 17:28:46

标签: c++ set

正如标题所说,我已经构建了set pair double value个值,我需要set<pair<unsigned int, double> > s(第二个)订购:

{{1}}

4 个答案:

答案 0 :(得分:10)

你应该使用比较器:

struct Cmp
{
    bool operator ()(const pair<unsigned int, double> &a, const pair<unsigned int, double> &b)
    {
        return a.second < b.second;
    }
};

然后您可以定义您的设置:

set <pair<unsigned int, double>, Cmp> your_set;

答案 1 :(得分:2)

事实上,

set有三个参数,其中最后两个是可选的。但在你的情况下,你想使用第二个参数,它告诉你如何对元素进行排序。默认情况下(忽略第三个参数),set为:

set<typename Key, typename Compare = less<Key>>

您只需要为第二个参数编写适当的类,例如:

template<typename Pair>
class CompareSecond
{
  bool operator()(const Pair& firstPair, const Pair& secondPair)
  {
    return firstPair.second < secondPair.second;
  }
}

然后你将set构建为:

typedef pair<unsigned int, double> MyPair;
set<MyPair, CompareSecond<MyPair>> s;

答案 2 :(得分:1)

在C ++ 11中,您可能希望使用lambda。不幸的是,不可能在未评估的上下文中获得lambda的类型。因此,我们需要作弊以获得参数推论:

#include <set>

template<typename T, typename Cmp>
std::set< T, Cmp > make_set(Cmp cmp) {
  return std::set<T, Cmp>(cmp);
}

int main()
{
  auto s = make_set<std::pair<int, int> >( 
    [](const std::pair<int, int>& p1, const std::pair<int, int>& p2) 
    { return p1.second < p2.second; } );

  return 0;
}

make_set是一个很好的算子,但如果你不能使用它 需要为set指定分配器。

答案 3 :(得分:0)

您可以使用地图而不是设置。使用键double和值unsigned int。 std :: map&lt; doublely,unsigned int&gt; S;