为什么我不能使用函数按值对地图进行排序?

时间:2017-03-18 10:01:54

标签: c++ dictionary

我试图按值对地图进行排序。我做了一个关于如何做到这一点的研究,最后得到了以下代码。但是,它不会编译,我不知道为什么。

#include <iostream>
#include <map>
#include <algorithm>
#include <iterator>
using namespace std;

bool cmp(pair<int,int> const & a, pair<int,int> const & b)
{
    return a.second != b.second?  a.second < b.second : a.first < b.first;
}

int main()
{
map<int,int>myMap;
for(int i=0,j=10;i<10;i++,j--)
{
    myMap.emplace(i,j);
}
for(map<int,int>::iterator it=myMap.begin();it!=myMap.end();it++)
{
    cout <<  it->first << " " << it->second << endl;
}

sort(myMap.begin(),myMap.end(),cmp);

for(map<int,int>::iterator it=myMap.begin();it!=myMap.end();it++)
{
    cout <<  it->first << " " << it->second << endl;
}
    return 0;
}

2 个答案:

答案 0 :(得分:1)

std::map始终按键排序。您需要先转换为对列表然后排序列表。说到这个,std::sort需要随机迭代器根据它的原型:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

随机迭代器意味着std::sort应该能够访问任何索引处的元素(即交换元素1和3)。但是,索引访问对map没有任何意义,因为它是通过键而不是索引访问的。

示例:

std::list<std::map<int,int>::value_type> list;
std::copy(myMap.begin(), myMap.end(), std::back_inserter(list));
list.sort(cmp);

答案 1 :(得分:1)

另一个(技术上)可能的错误原因(除了它在语义上是无意义的,并且映射迭代器不是随机的,如@myaut所说)是map(和unordered_map)基础值类型。在你的情况下,它实际上是std::pair<const int, int>。所以:

  • 您的比较函数不会接受它(它会尝试将引用绑定到错误类型)
  • 即使您修复了它,sort也会尝试移动值,分配它们。而且您无法分配到const变量