我有类似的地图:
map<int, map<int, map<int, int> > > myMap;
order-num | id | order-num-of-relation | relation-id
-----------------------------------------------------
0 | 1 | 0 | 2
-----------------------------------------------------
1 | 2 | 0 | 1
-----------------------------------------------------
| | 1 | 3
-----------------------------------------------------
2 | 3 | 0 | 2
-----------------------------------------------------
1(1),2(2),3(1)
我需要按照最后一张地图的大小(order-num-of-relation | relation-id)对此地图进行排序(更改“order-num”)。
我只需要这样做:
order-num | id | order-num-of-relation | relation-id
-----------------------------------------------------
0 | 1 | 0 | 2
-----------------------------------------------------
1 | 3 | 0 | 2
-----------------------------------------------------
2 | 2 | 0 | 1
-----------------------------------------------------
| | 1 | 3
-----------------------------------------------------
1(1),3(1),2(2)
我可以使用“sort”函数并传递自己的排序函数(我可以检查大小和返回true / false),还是我必须编写explicite排序算法?
答案 0 :(得分:2)
您不能/无法对地图进行排序。它们根据模板参数的可选第三个参数按键自动排序,模板参数是一个函数对象类,用于比较两个元素以确定哪个元素应该首先出现。 (如果第一个应该在第二个之前,它应该返回true,否则返回false)
所以你可以使用这样的东西:
struct myCompare
{
bool operator() const (const map<int,int> & lhs, const map<int,int> & rhs)
{
return lhs.size() < rhs.size();
}
};
但由于map<int,int>
是你的价值,而不是你的钥匙,所以这对你不起作用。
答案 1 :(得分:2)
你正在寻找的是在MultiIndex的Boost中完成的。来自Boost的好tutorial有关如何使用它来解决您对数据收集及其examples选择的要求。
当然,使用此集合对象可能也会改变您存储信息的方式。您将把它放在一个结构中。但是,如果您希望按照规范将您的信息视为具有唯一订单的数据库,那么这是我了解其清洁方式的唯一方式。
另一个选择是在将项目放在std :: map中时创建自己的排序运算符。因此:
struct Orders{
int order_num;
int id;
int order_num_relation;
int relation_id;
bool operator<(const Orders& _rhs){
if(order_num < _rhs.order_num) return true;
if(order_num == _rhs.order_num){
if( id < _rhs.id) return true;
if( id == _rhs.id){
//and so on, and so on
老实说,这种方式很痛苦,并且会引发一个非常容易被忽视的逻辑错误。使用Boost,大多数“棘手”的东西都会为你照顾。