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