Сортировка std :: map с использованием лямбды - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть карта, составленная из ключа (строка типа) и данных (тип кортеж). Я попытался отсортировать карту с помощью лямбды (см. Код ниже), но при компиляции я получил ошибку:

Код серьезности Описание Проект Состояние файла Подавление строки Ошибка C2676 бинарный '-': 'const std:: _Tree_unchecked_iterator >>> 'не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора, с помощью [_Kty = std :: string, _Ty = std :: tuple] SandBox C: \ Program Files (x86) \ Microsoft VisualStudio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \gorithm 3466

Код серьезности Описание Ошибка состояния подавления строки файла проекта C2672 '_Sort_unchecked': не найдена соответствующая перегруженная функция SandBox C: \ ProgramФайлы (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \gorithm 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 ]

2 голосов
/ 10 ноября 2019

Ваша ошибка в том, что std::sort требует random access iterator, но итератор std :: map - bidirectional iterator. Вы увидите, что operator-() не определено для bidrectional iterators

, см. Требования к типу здесь .

В дополнение к этому, то, что вы делаете, кажется странным. Похоже, вы пытаетесь отсортировать карту на основе первого элемента ее значения. Карта неявно сортируется с использованием (по умолчанию) std::less по типу ключа. Если вы хотите отсортировать в другом порядке, вы должны использовать собственный компаратор на карте.

1 голос
/ 10 ноября 2019

std :: map представляет собой красно-черное дерево. Вы не можете отсортировать его по значению. Если вы хотите, чтобы ваша карта сортировалась по значению, вам нужно перевернуть ее.

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:
...