Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按大小对地图进行排序_C++_Sorting_Map_Iterator - Fatal编程技术网

C++ 按大小对地图进行排序

C++ 按大小对地图进行排序,c++,sorting,map,iterator,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 -----------------------------

我有类似的地图:

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
-----------------------------------------------------
11、31、22


我可以使用sort函数并在这里传递自己的排序函数,在这里我可以检查大小并返回true/false,还是我必须编写显式排序算法?

您不能/不能对地图进行排序。它们根据模板参数的可选第三个参数按键自动排序,该参数是一个函数对象类,用于比较两个元素以确定哪一个应该首先出现。如果第一个在第二个之前,则返回true,否则返回false

所以你可以用这样的方法:

struct myCompare
{
    bool operator() const (const map<int,int> & lhs, const map<int,int> & rhs)
    {
        return lhs.size() < rhs.size();
    }
};

但由于地图是你的价值,而不是你的钥匙,这对你来说并不适用。

你不能对地图进行排序。它们根据模板参数的可选第三个参数按键自动排序,该参数是一个函数对象类,用于比较两个元素以确定哪一个应该首先出现。如果第一个在第二个之前,则返回true,否则返回false

所以你可以用这样的方法:

struct myCompare
{
    bool operator() const (const map<int,int> & lhs, const map<int,int> & rhs)
    {
        return lhs.size() < rhs.size();
    }
};

但是,由于地图是您的价值,而不是您的钥匙,这对您来说并不完全有效。

您所寻找的东西已经在Boost中完成了。这里有一个来自Boost的好例子,告诉你如何使用它来解决你对数据收集的要求以及它们的选择

当然,使用此集合对象也可能会改变存储信息的方式。您将把它放在一个结构中。然而,如果你想把你的信息当作一个数据库,有一个独特的订单规格,这是唯一的方式,我知道如何清洁

另一个选项是在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,大部分棘手的事情都会为您解决。

您所寻找的东西已经在Boost中完成。这里有一个来自Boost的好例子,告诉你如何使用它来解决你对数据收集的要求以及它们的选择

当然,使用此集合对象也可能会改变存储信息的方式。您将把它放在一个结构中。然而,如果你想把你的信息当作一个数据库,有一个独特的订单规格,这是唯一的方式,我知道如何清洁

另一个选项是在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,大部分棘手的问题都会为您解决。

为什么这对我不起作用?只需要一些begin->second或类似的东西,或者不需要?它不起作用,因为您无法按值对地图进行排序。也许地图不是你想要的。也许你可以用矢量,意思是:矢量为什么这对我不起作用?只需要一些begin->second或类似的东西,或者不需要?它不起作用,因为您无法按值对地图进行排序。也许地图不是你想要的。也许您可以使用vectorI,意思是:vectoraps是有序的,并且在声明模板时以固定的顺序作为模板的参数。您不能按照不同的顺序对映射进行重新排序,因为您需要将数据移动到不同的容器中,然后在那里进行处理。还要注意的是,映射元素中的键在插入后不能更改。映射是有序的,并且在声明模板时以固定顺序作为模板的参数。您不能按照不同的顺序对映射进行重新排序,因为您需要将数据移动到不同的容器中,然后在那里进行处理。还请注意,插入后无法更改贴图元素中的键。