是否有任何C ++函数对unordered_map进行排序?

问题描述 投票:1回答:5

如何根据值对C ++中的unordered_map进行排序?有功能吗?

c++ stl
5个回答
1
投票

您无法真正更改std::map的元素。但是,可以使用std::vector首先复制向量中的元素,然后使用std::sort()Sort elements of std::map

std::map

2
投票

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这是一个哈希表(这些元素根据键的哈希值有所排序)。


1
投票

此答案涵盖了您引用映射本身内部值的情况。

首先,要使用的容器是std::unordered_map。标准库中没有std::map,只有ordered_mapmap

您可以为自己的比较器提供unordered_map,以便根据需要对其进行排序。例如:

map

并像这样使用

struct MyOrder
{
    constexpr bool operator()(MyType a, MyType b) const 
    {
        // return true, so that a < b accodring to your definition
    }
};

0
投票

您无法重新排列([std::map<MyType, MyOrder> myMap; ordered_(/ map)的元素。

您可以将值(和/或键)复制到setstd::vector中。


0
投票

没有std::sort用于存储由键值和映射值的组合形成的元素,其中,键值用于对元素进行排序和标识。

要按值排序,您可以简单地创建倒置地图

std::map

有许多解决此问题的方法,根据您的需要,您可能会优先选择其他方法。

© www.soinside.com 2019 - 2024. All rights reserved.