无法编译std :: map排序,为什么?

时间:2010-05-18 12:39:41

标签: c++

这是我的代码:

map<string, int> errs;
struct Compare {
    bool operator() (map<string, int>::const_iterator l, 
        map<string, int>::const_iterator r) { 
        return ((*l).second < (*r).second); 
    }
} comp;
sort(errs.begin(), errs.end(), comp);

无法编译。这就是我得到的:

no matching function for call to ‘sort(..’

为什么这样?有人可以帮忙吗?谢谢!

7 个答案:

答案 0 :(得分:10)

您无法对地图进行排序。它有自己的排序顺序,在构造时定义为默认值(使用<)或传入比较器。

答案 1 :(得分:6)

根据定义,地图按其键排序,因此您无法通过其值来使用地图。

如果要按非默认顺序对键进行排序,可以提供备用比较功能作为地图的第三个模板参数。

如果您尝试按其值对地图进行排序,那么您可以尝试使用Boost.MultiIndex来制作bidirectional map吗?

答案 2 :(得分:5)

我假设你在做using namespace std;。在那个sort方法中,迭代器需要是随机访问迭代器。但是map迭代器是双向的,所以它不会编译。

答案 3 :(得分:4)

这可能是因为std :: map有一个不可赋值的迭代器。

std :: map有一个严格升序的不变量,它总是按键排序。

在这里阅读更多相关信息: http://www.sgi.com/tech/stl/UniqueSortedAssociativeContainer.html

并注意1: http://www.sgi.com/tech/stl/Map.html

答案 4 :(得分:1)

除了Marcelo的回答:std :: sort使用的谓词应该取值,而不是迭代器作为输入。

答案 5 :(得分:0)

如前所述Marcelo你不能用std :: sort对地图进行排序你需要在构造函数中定义sort方法我认为是value_compare。

struct Compare
{
bool operator()(const char* a, const char* b) const
{
return strcmp(a,b) < 0;
};
std::map<char, char, Compare> compareMap;

答案 6 :(得分:0)

Compare模板参数使用映射键来比较(或引用键),而不是迭代器。此外,std::map在实例化时采用该类型,并通过密钥自动排序(最常见的实现是red-black tree)。

查看boost::multi_index以获取多键访问权限。