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