C++ 按值排序std::map

C++ 按值排序std::map,c++,sorting,dictionary,std,C++,Sorting,Dictionary,Std,现在我有一个映射,我需要按值(int)排序,然后按键(string)排序(如果有平局)。我知道我需要为此编写一个定制的比较函数,但是到目前为止我还不能使它工作。 (我需要将我的资料存储在地图中,因为字符串是单词,整数是频率,我需要稍后通过搜索键来“查找”配对)只能按键排序std::map 如果还需要按值对其排序,则需要创建一个以int为键,以字符串为值的函数,并通过在映射上迭代来填充它 或者,您也可以创建一个向量,通过在映射上迭代填充,只需使用std::sort()即可std::map只能按键排

现在我有一个映射,我需要按值(int)排序,然后按键(string)排序(如果有平局)。我知道我需要为此编写一个定制的比较函数,但是到目前为止我还不能使它工作。
(我需要将我的资料存储在地图中,因为字符串是单词,整数是频率,我需要稍后通过搜索键来“查找”配对)

只能按键排序
std::map

如果还需要按值对其排序,则需要创建一个以
int
为键,以
字符串
为值的函数,并通过在映射上迭代来填充它


或者,您也可以创建一个
向量
,通过在映射上迭代填充,只需使用
std::sort()

即可
std::map
只能按键排序(在您的情况下为字符串)

如果还需要按值对其排序,则需要创建一个以
int
为键,以
字符串
为值的函数,并通过在映射上迭代来填充它


或者,您也可以创建一个
向量
,通过在地图上迭代填充,只需使用
std::sort()

您可以使用
std::multiset

您可以使用
std::multiset
根据给定的信息,这有点像猜谜游戏,但是,除非你正在洗牌大量的数据,否则这可能是可行的

using entry = std::pair<std::string, int>;
using CompareFunc = bool(*)(const entry&, const entry&);
using sortset = std::set<entry, CompareFunc>;
sortset bv(themap.begin(), themap.end(), [](auto& a, auto&b){ a.second!=b.second?a.second<b.second:a.first<b.first; });
for(const auto& d : bv) {
    // 
}
使用entry=std::pair;
使用CompareFunc=bool(*)(常量条目&,常量条目&);
使用sortset=std::set;

sortset bv(themap.begin(),themap.end(),[](auto&a,auto&b){a.second!=b.second?a.second根据给定的信息,这有点像一个猜测游戏,但除非您正在洗牌大量数据,否则可能会这样做

using entry = std::pair<std::string, int>;
using CompareFunc = bool(*)(const entry&, const entry&);
using sortset = std::set<entry, CompareFunc>;
sortset bv(themap.begin(), themap.end(), [](auto& a, auto&b){ a.second!=b.second?a.second<b.second:a.first<b.first; });
for(const auto& d : bv) {
    // 
}
使用entry=std::pair;
使用CompareFunc=bool(*)(常量条目&,常量条目&);
使用sortset=std::set;

sortset bv(映射开始(),映射结束(),[](自动&a,自动&b){a.second!=b.second?a.secondA
std::map
总是按键排序。因此,将其存储在不同的容器中,甚至可以存储在
std::map
std::multimap
中。这不是映射的工作方式。除非你想使用新的透明比较工具,但你仍然无法从中获得性能。你考虑过吗red在数据容器旁边维护一个索引容器?为什么你认为你需要先按值再按键排序?这纯粹是为了迭代目的吗?同样,如果你的迭代和查找有不同的要求,那么这是一个标志,你需要第二个类似容器IMO的视图。这里可能对你有用的一件事是…@Dedupli只移动门柱的cator,因为现在您打破了按K查找。也许填充
std::set
并为该集合提供比较函数会起作用?该集合应该可以通过您的maps迭代器构造。可能重复的
std::map
总是按键排序。因此,将其存储在不同的容器中,可能是e即使是
std::map
std::multimap
。这不是映射的工作方式。除非您想进入新的透明比较工具,但您仍然无法从中获得性能。您是否考虑过在数据容器旁边维护索引容器?为什么您认为需要按值排序,然后按键排序?这是吗t纯粹出于迭代目的?同样,如果您的迭代和查找有不同的要求,那么这是一个标志,您需要第二个类似容器IMO的视图。这里可能对您有用的一件事是…@重复数据消除器,它只移动目标桩,因为现在您打破了按K查找。可能需要填充
std::set
并提供带有比较函数的集合可以工作吗?该集合应该可以通过maps迭代器进行构造。这可能是重复的原因,而不是更简单的
std::multimap>
std::multimap
按键排序,而不是按值排序。具有相同键的元素的插入不按值排序():“如果容器包含具有等效键的元素,则在该范围的上限处插入。”(自C++11)因此,使用成对的
std::multiset
std::set
提供了一种对两者进行排序的方法。为什么不使用更简单的
std::multimap>
std::multimap
按键排序而不是按值排序。插入具有相同键的元素不按值排序():“如果容器具有具有等效键的元素,则在该范围的上限处插入。“(自C++11)。因此,使用成对的
std::multiset
std::set
提供了一种对两者进行排序的方法。为什么不简单地使用一组(int,std::string),然后你可以删除无用的操作符?我同意,这听起来更干净,但是我需要转换映射,不是吗?为什么不简单地使用一组(int,std::string),然后你可以删除无用的操作符?我同意,这听起来更干净,但是我需要转换映射,不是吗?