如何按一个值属性对海量地图进行排序
How to sort massive map by one value property?
我有一个map<std::string, myStruct>
,我想知道如何根据myStruct.order
中的int属性对映射中的项进行排序,以及myStruct
的两个或多个顺序是否是使映射无法被myStruct的该字段启动的键(字符串)的同一抛出列表?在C++03中有什么奇特的方法吗(可能是使用boost)?
boost在MultiIndex中有一个完整(复杂)的功能,但如果我理解您的需求,那么在这种情况下就太过分了。一个相当简单的方法是建立一个指向myStruct的指针列表并进行排序。然后你可以很容易地检查重复的键(这些键变成了相邻键)。
排序应该使用类型为less<const myStruct*>
的函子,即
bool compare_orders(const myStruct* a, const myStruct* b) { return a->order < b->order; }
对地图进行"排序"有什么意义?当然,地图可以在内部组织为BST或其他东西,以加快访问速度,但从概念上讲,地图的元素没有特定的顺序。
除此之外,您可以为键提供排序方法(因为即使您确实以特定方式组织映射,它也是按键的顺序,而不是按值的顺序),但不能为具有映射第三个模板参数的值提供排序方法。
不能这样做,使用std::map
-pair
中的first
用于比较(它被称为键)。在您的情况下,std::string
是键。
您可以使用std::set< std::pair< std::string, MyStruct > >
,然后为两个std::pair< std::string, MyStruct >
-s实现operator<
。
或者,如果可能/允许/合适等,您可以更改std::map
的定义。这实际上取决于你想做什么,以及你被允许做什么
或者其他容器(保持元素的顺序,如插入的std::list
、std::vector
等),然后使用std::sort
或容器的sort
方法(如果存在)。
我同意其他答案,即不清楚为什么需要对地图进行排序。但是,您可以使用双向映射将myStruct和字符串都视为键。
有一个在推动:
http://www.boost.org/doc/libs/1_48_0/libs/bimap/doc/html/index.html
这里有一个例子
http://www.boost.org/doc/libs/1_48_0/libs/bimap/doc/html/boost_bimap/examples/simple_bimap.html
- 是否有任何C++功能可以对地图进行排序?
- 如何使地图按值C++排序
- 我正在尝试按降序对地图进行排序,但没有得到预期的结果?
- 尝试按值对地图进行排序,但出现错误
- 对双精度地图进行排序
- 如何在OMNeT++中对地图进行排序?
- 多地图<矢量<int>>,字符>如何排序?
- 少的专业化<>适用于地图但不适用于排序
- 常量地图的意外排序
- C++按值对unordered_map或地图进行排序
- 如何对其中包含地图的列表进行排序
- 为什么我无法使用函数按值对地图进行排序?
- 如何在地图中插入对象以保持其排序
- 根据地图值的属性对地图进行排序
- C++,根据秒迭代对地图内容进行排序
- 如何以相反的顺序对地图进行排序
- 在 c++ 中对地图进行排序
- 获取按地图值排序的映射键向量的最快方法
- 标准::地图按值大小排序(设置<int>)
- 对基于地图C++集合重新排序的有效方法