这是我的代码:
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(..’
为什么这样?有人可以帮忙吗?谢谢!
答案 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
答案 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
以获取多键访问权限。