set<pair<K, V> > 默认具有更大的函子

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

本文关键字:gt lt 默认 pair set      更新时间:2023-10-16

我有map <string,int>,我必须根据值对地图进行排序。我已经将地图元素转储到一个set<pair<K, V> >中,我以低于顺序的方式获得了所有元素set因为它是用较少的函子构建的。那么有什么方法可以使用函子在set中插入元素greater

正如您在此参考中看到的,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::mapstd::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;
您可以将

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