设置<pair <k,v =“”>&gt;默认情况下使用更大的仿函数</pair <k,>

时间:2015-01-30 12:32:44

标签: c++ stl

我有map <string,int>我需要在值上排序地图。 我已经在set<pair<K, V> >中转储了地图元素,其中我得到的所有元素都少于顺序,因为set是用较少的仿函数构造的。那么有什么方法可以在带有set仿函数的greater中插入元素。

2 个答案:

答案 0 :(得分:2)

您可以将std::set的第二个模板参数与std::greater<Key>一起使用,而不是使用默认std::less<Key>

std::set<Foo, std::greater<Foo>> s;

这是一个有效的例子:

#include <set>
#include <functional>
#include <iostream>

int main()
{
  std::set<int> a{4,2,8,6,4};
  std::set<int, std::greater<int>> b(a.begin(), a.end());

  for (auto i : a) std::cout << i << " ";
  std::cout << '\n';

  for (auto i : b) std::cout << i << " ";
  std::cout << '\n';
}

输出:

2 4 6 8 
8 6 4 2 

答案 1 :(得分:2)

正如您在此reference中看到的那样,std::set定义为:

template<
    class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>
> class set;

要按不同的顺序排序,我们只需提供不同的Compare,在这种情况下:

std::set<std::pair<K,V>, std::greater<std::pair<K,V> > mySet;

但是如果你已经有std::map个对象,std::map也允许使用不同的比较器:

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

如果您希望按K按递减顺序排序,而不是将所有元素复制到set,那么您可能刚刚开始:

std::map<K, V, std::greater<K> > myDecreasingOrderedMap;