Ошибка алгоритма: Аргумент не может скрыть 1 от пары - PullRequest
0 голосов
/ 09 июня 2019

В этом задании я создаю приложение, в котором пользователь вводит номер телефона, будь то буквы или нет.

Я пытался использовать const на картах или в векторе, чтобы увидеть, исправляет ли онпроблема, но я думаю, что это просто создало больше ошибок.

Вот код, который, как мне кажется, вызывает некоторые проблемы

std::vector<int> mappednums;
    for (char& achar : word) {
        auto itr = std::find_if(lookupmap.begin(), lookupmap.end(), [&](std::pair<int, std::vector<char>>& aPair)->bool
            {

                auto itr = std::find_if(aPair.second.begin(), aPair.second.end(), [&](char& ch) {
                    return ch == achar;
                    });

                if (itr != aPair.second.end()) {
                    return true;
                }
                });
        if (itr != lookupmap.end()) {
            mappednums.push_back(itr->first);
        }

Я ожидал, что это найти пару, но это дает мне ошибкуговоря, что он не может преобразовать аргумент 1 из кода выше.Вот ошибка:

'bool main::<lambda_06927067034dcc4076cc2514a7e290fe>::operator ()(std::pair<int,std::vector<char,std::allocator<char>>> &) const': cannot convert argument 1 from 'std::pair<const _Kty,_Ty>' to 'std::pair<int,std::vector<char,std::allocator<char>>> &'

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Краткий ответ: Добавьте const перед int в параметре первой лямбды:

[&](std::pair<const int, std::vector<char>>& aPair)->bool

Длинный ответ:

Согласно std :: map reference map<K, V>::iterator является итератором для map<K, V>::value_type, а map<K, V>::value_type равно pair<const K, V> (ваш случай pair<const int, vector<char>>).

Проблема в том, что вы пытаетесь привязать pair<int, vector<char>> & ссылку к значениям типа pair<const int, vector<char>>. Если бы вы могли сделать это, вы бы смогли изменить ключи на карте, полностью разрушив внутреннюю структуру карты. Таким образом, вы не можете изменять их, и это обозначается как const в pair<const int, vector<char>>.

0 голосов
/ 09 июня 2019

Вы не правильно объявили параметр для своей лямбды. Должно быть

[&](std::pair<const int, std::vector<char>>& aPair)

Обратите внимание на const int в качестве первого типа пары. Тип значения карты (и то, что вы получаете, когда разыменовываете итератор карты), имеет первый член константы пары, так как изменение значения ключа, если оно является картой, может потенциально нарушить сортировку в древовидной структуре, используемой для хранения карта.

Один из способов избежать подобных проблем - использовать

[&](LookupMapType::value_type &aPair)

(где «LookupMapType» - это тип lookupmap).

Если ваш компилятор поддерживает C ++ 14 или более позднюю версию (и вы включаете ее, если необходимо), вы можете упростить это еще до

[&](auto &aPair)
...