我有一个由键(类型字符串)和数据(类型元组)组成的映射。 我尝试使用lambda对地图进行排序(请参见下面的代码),但是在编译时出现错误,提示
严重性代码描述项目文件行抑制状态 错误C2676二进制'-':'const std :: _ Tree_unchecked_iterator >>>'没有定义此运算符或未转换为预定义运算符可接受的类型 与 [ _Kty = std :: string, _Ty = std :: tuple ] SandBox C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ algorithm 3466
严重性代码描述项目文件行抑制状态 错误C2672'_Sort_unchecked':找不到匹配的重载函数SandBox C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ algorithm 3466
我的代码:
#include <iostream>
#include <string>
#include <tuple>
#include <map>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main() {
std::vector<std::string> strarr { "zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"};
int length = strarr.size();
std::string str = "";
map<string, tuple<int, int>> myMap;
for (int i = 0; i < length; i++)
myMap[strarr[i]] = make_tuple(strarr[i].length(), ++(get<1>(myMap[strarr[i]])));
typedef std::function<bool(std::pair<string, tuple< int, int >>, std::pair<string, tuple< int, int >>)> Comparator;
Comparator compFunctor =
[](std::pair<string,tuple< int, int>> el1, std::pair<string, tuple< int, int >> el2)
{
return (get<0>(el1.second) < get<0>(el2.second));
};
std::sort(myMap.begin(), myMap.end(), compFunctor);
}
那是什么错误?我确信这有些愚蠢,但我自己无法解决。
谢谢。
答案 0 :(得分:2)
您的错误是std::sort
需要一个random access iterator
,但是std :: map的迭代器是一个bidirectional iterator
。您将看到未为operator-()
bidrectional iterators
请参阅类型要求here。
此外,您正在做的事情似乎很奇怪。您似乎正在尝试根据值的第一个元素对地图进行排序。使用键类型(默认情况下)std::less
对映射进行隐式排序。如果要以其他顺序排序,则应在地图上使用自定义比较器。
答案 1 :(得分:1)
std :: map是red-black树。您无法按值对它进行排序。如果要按值对地图进行排序,则需要将其翻转。
struct compFunctor{
bool operator()(tuple< int, int> el1, tuple< int, int > el2) const {
return get<0>(el1) < get<0>(el2);
}
};
map< tuple<int, int>, string, compFunctor> myMap: