std :: for_each () для карты дает неверную ошибку инициализации - PullRequest
0 голосов
/ 16 января 2019

Я относительно новичок в STL и особенно в библиотеке алгоритмов. Я пытаюсь перебрать std::multimap, где и ключ, и значение имеют тип std::string, используя функцию std::for_each() и выполнить какую-то задачу.

Вот мой std::multimap:

std::multimap<std::string, std::string> myMap;
for (int i = 0; i < 5; i++) {
    myMap.insert(std::make_pair("key", "value"));
}

А вот строка с for_each() функцией:

std::for_each(myMap.begin(), myMap.end(), ask);

Функция ask() определяется следующим образом:

void ask(std::pair<std::string, std::string>& entry) {
    // do something...
}

Программа выдает мне следующую ошибку:

ошибка: неверная инициализация ссылки типа 'std :: __ cxx11 :: basic_string &' из выражения типа «Станд :: пара, std :: __ cxx11 :: basic_string> '

Я знаю, что проблема связана с функцией for_each(), и я предполагаю, что это потому, что параметр функции ask() неверен. Но, насколько мне известно, каждая запись std::multimap представляется как std::pair, поэтому не должна ли функция ask() принимать объект std::pair в качестве параметра?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Распределитель по умолчанию, используемый для std::multimap:

std::allocator<std::pair<const Key, T>

Итак, ключи в std::multimap равны const, что делает тип

std::pair<const std::string, std::string>

где as ask() ожидает параметр как ссылку на тип

std::pair<std::string, std::string>

Изменить ask() на

void ask(std::pair<const std::string, std::string>& entry)
{
}
0 голосов
/ 16 января 2019

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

void ask(std::multimap<std::string, std::string>::reference entry) {
    // do something...
}

Возможно, было бы неплохо создать псевдоним типа для этого типа карты, чтобы вам не приходилось повторять его

using myMap_t = std::multimap<std::string, std::string>;

void ask(myMap_t::reference entry) {
    // do something...
}

int main() {
    myMap_t myMap;
    for (int i = 0; i < 5; i++) {
        myMap.insert(myMap_t::value_type("key", "value"));
    }

    std::for_each(myMap.begin(), myMap.end(), ask);
}
0 голосов
/ 16 января 2019

Тип элемента std::multimap<std::string, std::string> равен std::pair<const std::string, std::string>. Обратите внимание на const

...