Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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_Dictionary_Std Pair - Fatal编程技术网

C++ 对成对和双重映射进行排序

C++ 对成对和双重映射进行排序,c++,sorting,dictionary,std-pair,C++,Sorting,Dictionary,Std Pair,我有一张地图:mapvalore。其中,一对表示我的坐标系,另一对表示(i,j)坐标中值的两倍 现在我必须将这张地图从较小的双精度到较高的双精度排序(显然坐标必须链接到相应的双精度)。有人能帮我吗?您只需编写一个自定义比较器。在这里,您必须构建一个完整的对象,因为您需要根据键在特定映射中的值来比较它们。这应符合您的要求: class Comparator { std::map<std::pair<int, int>, double>& orig_map;

我有一张地图:
map,long double>valore
。其中,一对表示我的坐标系,另一对表示(i,j)坐标中值的两倍


现在我必须将这张地图从较小的双精度到较高的双精度排序(显然坐标必须链接到相应的双精度)。有人能帮我吗?

您只需编写一个自定义比较器。在这里,您必须构建一个完整的对象,因为您需要根据键在特定映射中的值来比较它们。这应符合您的要求:

class Comparator {
    std::map<std::pair<int, int>, double>& orig_map;

public:
    Comparator(std::map<std::pair<int, int>, double>& orig_map)
    : orig_map(orig_map) {}

    bool operator () (const std::pair<int, int>& first,
            const std::pair<int, int>& second) const {
        return orig_map[first] < orig_map[second];
    }
};
类比较器{
标准::地图和原始地图;
公众:
比较器(标准::映射和原始映射)
:原始地图(原始地图){}
bool运算符()(const std::pair&first,
常数std::成对(第二)常数{
返回原始地图[第一个]<原始地图[第二个];
}
};
您可以使用它从原始地图构建特殊顺序的地图:

std::map< pair < int , int > , long double> valore;
// load the map valore ...

// build a copy of valore sorted according to its value
Comparator comp(map);
std::map<std::pair<int, int>, double, Comparator> val_sorted(valore.begin(),
    valore.end(), comp);
std::map,long double>valore;
//加载地图valore。。。
//创建一个valore的副本,并根据其值进行排序
比较器comp(map);
std::map val_排序(valore.begin(),
valore.end(),comp);
您可以迭代
val\u sorted
,它是按其值排序的


注意:切勿在
val\u sorted
中插入
valore
中不存在的元素。正确的使用方法是每次原始映射可能发生更改时创建一个新实例,或者至少清空它并重新加载它。

正如其他人所提到的,无法直接使用值对映射进行排序。 使用值对地图进行排序的一种方法如下所示

  • 创建一个向量,将贴图元素作为一对。即,
    配对
    。在您的情况下,这将是
    向量
  • 对向量进行排序(使用自定义排序函数),现在可以按值对元素进行排序
请参见下面的示例。(使用
-std=c++11
选项编译)


由于下面的映射包含第一个参数作为整数对,第二个参数作为双精度,因此无法基于第一个参数(整数对)进行排序

map,long double>valore

需要编写一个自定义函数,以便根据坐标进行排序。

交换地图键和值(即
std::map
),然后免费对其进行排序。地图已排序。您无法更改此选项您需要帮助对特定地图进行排序吗?那就给我们一个,我们会免费分类的!可能会有帮助。您甚至可以删除您的
custom\u sort
(这不是一个排序功能,而是一个比较功能,
custom\u less
将是一个更好的命名(或者
less\u by\u first
)。它只会为具有相同双精度的元素指定顺序。哦,是的。谢谢在这种情况下,我们不需要自定义排序函数。@Jarod42有意义。重命名该函数。您甚至不能修改第一个映射,因为修改会更改第二个映射的顺序。其他UB:/
#include <bits/stdc++.h>
using namespace std;

/* custom compare function. ascending order. Compares first elemens of p1 & p2 */
static bool custom_compare(const pair< double, pair<int, int> > & p1, const pair<double, pair<int, int> > & p2) {
        return p1.first < p2.first;
}

void sortfn(map<pair<int, int>, double>& m) {

        /* vector if pairs to hold values. */
        vector< pair<double, pair<int, int> > > vec;

        /* traverse the map and populate the vector */
        for (auto it = m.begin(); it != m.end(); it++) {
                vec.push_back(make_pair(it->second, it->first));
        }

        /* call sort method on the vector with custom compare method */
        sort(vec.begin(), vec.end(), custom_compare);

        for (auto it = vec.begin(); it != vec.end(); it++) {
                cout<<it->first<<" ( "<<it->second.first<<", "<<it->second.second<<" )"<<endl;

        }
}
int main() {

        map<pair<int, int>, double> m;

        m.insert(make_pair(make_pair(0, 0), 5));
        m.insert(make_pair(make_pair(1, 1), 0));
        m.insert(make_pair(make_pair(2, 2), 10));

        sortfn(m);



        return 0;
}
0 ( 1, 1 )
5 ( 0, 0 )
10 ( 2, 2 )
 map< pair < int , int > , long double> valore