set<pair<K, V> > 默认情况下具有更大的仿函数

set<pair<K, V> > with greater functor by default

我有 map <string,int> 必须根据值对地图进行排序。 我在 set<pair<K, V> > 中转储了地图元素,其中我得到的所有元素都低于顺序,因为 set 是用 less 函子构造的。那么有什么办法可以用 greater 仿函数在 set 中插入元素。

您可以将 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 

正如您在此 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;