使用lambda对std :: map进行排序

时间:2019-11-10 14:01:29

标签: sorting c++11 stdmap

我有一个由键(类型字符串)和数据(类型元组)组成的映射。 我尝试使用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);
}

那是什么错误?我确信这有些愚蠢,但我自己无法解决。

谢谢。

2 个答案:

答案 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: