按大小排序地图

时间:2011-01-22 19:26:59

标签: c++ sorting map iterator

我有类似的地图:

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排序算法?

2 个答案:

答案 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,大多数“棘手”的东西都会为你照顾。