如何通过一个值属性对大量地图进行排序?

时间:2012-01-29 21:53:40

标签: c++ sorting boost map

我有map<std::string, myStruct>我想知道如何通过myStruct.order中的int属性对map中的项进行排序,如果2个或更多myStruct个订单是相同的,则抛出键列表(字符串) )使myStruct的那个字段无法使用地图?是否有任何奇特的方式在C ++ 03中进行(可以使用boost)?

4 个答案:

答案 0 :(得分:1)

boost在MultiIndex中有一个完整(且复杂)的功能,但是如果我理解了你的要求,那么在这种情况下它就太过分了。一个相当简单的方法是构建一个指向myStruct和排序的指针列表。然后,您可以轻松检查重复的密钥(这些密钥成为相邻的密钥)。

sort应使用less<const myStruct*>类型的仿函数,即

bool compare_orders(const myStruct* a, const myStruct* b) { return a->order < b->order; }

答案 1 :(得分:0)

您无法使用std::map执行此操作 - first中的pair用于比较(称为密钥)。在您的情况下,std::string

您可以使用std::set< std::pair< std::string, MyStruct > >,然后针对两个operator< - s实施std::pair< std::string, MyStruct >

或者,您可以更改std::map的定义,如果可能/允许/合适/等。这实际上取决于你想要做什么以及你可以做什么。

或其他一些容器(保持元素的顺序,如std::liststd::vector等),然后使用std::sort或容器的sort方法,如果存在。

答案 2 :(得分:0)

“排序”地图有什么意义?当然,地图可以在内部组织为BST或其他东西,以便更快地访问,但从概念上讲,地图的元素没有特定的顺序。

除此之外,你可以为键提供一种排序方法(因为即使你以特定的方式组织地图,它是按键的顺序,而不是值的顺序),但不是map的第三个模板参数的值。

答案 3 :(得分:0)

我同意其他答案,不清楚为什么需要对地图进行排序。但您可以使用双向映射来查看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