如何按一个值属性对海量地图进行排序

How to sort massive map by one value property?

本文关键字:地图 排序 何按一 属性      更新时间:2023-10-16

我有一个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::liststd::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