如何根据值对C ++中的unordered_map
进行排序?有功能吗?
您无法真正更改std::map
的元素。但是,可以使用std::vector
首先复制向量中的元素,然后使用std::sort()
。Sort elements of std::map
。
std::map
A map是#include<iostream>
#include <map>
#include <vector>
#include <algorithm>
typedef std::pair<std::string,int> pair;
int main()
{
// input map
std::map<std::string,int> map = {
{"two", 2}, {"one", 1}, {"four", 4}, {"three", 3}
};
// create an empty vector of pairs
std::vector<pair> vec;
// copy key-value pairs from the map to the vector
std::copy(map.begin(),
map.end(),
std::back_inserter<std::vector<pair>>(vec));
// sort the vector by increasing order of its pair's second value
// if second value are equal, order by the pair's first value
std::sort(vec.begin(), vec.end(),
[](const pair& l, const pair& r) {
if (l.second != r.second)
return l.second < r.second;
return l.first < r.first;
});
// print the vector
for (auto const &pair: vec) {
std::cout << '{' << pair.first << "," << pair.second << '}' << '\n';
}
return 0;
}
。与associative container不同,您可以控制元素的位置,而associative container本身可以控制元素的顺序。创建关联容器后,无法更改顺序。
没有sequential containers是标准C ++。 ordered_map
是一棵树(因此元素已经根据比较器进行了排序)和std::map
这是一个哈希表(这些元素根据键的哈希值有所排序)。
此答案涵盖了您引用映射本身内部值的情况。
首先,要使用的容器是std::unordered_map
。标准库中没有std::map
,只有ordered_map
或map
。
您可以为自己的比较器提供unordered_map
,以便根据需要对其进行排序。例如:
map
并像这样使用
struct MyOrder
{
constexpr bool operator()(MyType a, MyType b) const
{
// return true, so that a < b accodring to your definition
}
};
您无法重新排列([std::map<MyType, MyOrder> myMap;
)ordered_
(/ map
)的元素。
您可以将值(和/或键)复制到set
和std::vector
中。
没有std::sort
用于存储由键值和映射值的组合形成的元素,其中,键值用于对元素进行排序和标识。
要按值排序,您可以简单地创建倒置地图:
std::map
有许多解决此问题的方法,根据您的需要,您可能会优先选择其他方法。