Использование переменной диапазона в качестве аргумента функции при циклическом просмотре карты - PullRequest
2 голосов
/ 18 февраля 2020

Я пытаюсь провести через карту карт oop и передать каждую пару в функцию, которая изменяет содержимое. Когда я пытаюсь скомпилировать приведенный ниже код, я получаю следующую ошибку относительно объявления переменной диапазона item:

error: invalid initialization of non-const reference of type 'std::pair<std::__cxx11::basic_string<char>, std::map<std::__cxx11::basic_string<char>, int> >&' from an rvalue of type 'std::pair<std::__cxx11::basic_string<char>, std::map<std::__cxx11::basic_string<char>, int> >'
     for(std::pair<std::string, std::map<std::string, int>>& index : names)

Когда я пытаюсь использовать auto& для объявления индекса переменной диапазона, ошибка переходит от объявления переменной диапазона к вызову функции incrementAndPrintIt(index);

#include <iostream>
#include <vector>
#include <map>

void incrementAndPrintIt(std::pair<std::string, std::map<std::string, int>>& value)
{
    for(auto& j : value.second) {
        j.second = j.second + 1;
        std::cout << "j:  " << j.second << std::endl;
    }
}

int main() {

    //initialize a map of maps
    std::map<std::string, std::map<std::string, int>> names = {{"women",{{"Rita",2}}},{"men",{{"Jack",4}}}};

    for(std::pair<std::string, std::map<std::string, int>>& index : names) {
        incrementAndPrintIt(index);
    }
    return 0;
}  

1 Ответ

2 голосов
/ 18 февраля 2020
 for(std::pair<std::string, std::map<std::string, int>>& index : names) 

В std::map ключ карты, первое значение в паре, является постоянным значением.

Это должно быть:

 for(std::pair<const std::string, std::map<std::string, int>>& index : names) 

incrementAndPrintIt() Параметр также должен быть настроен на то же самое.

Легко использовать auto, чтобы вообще избежать всей этой головной боли:

 for(auto& index : names) 

Но это не поможет incrementAndPrintIt() параметр. Однако для этого не нужен ключ карты, поэтому вы можете просто передать ему index.second и сэкономить много износа на клавиатуре:

#include <iostream>
#include <vector>
#include <map>

void incrementAndPrintIt(std::map<std::string, int> &value)
{
    for(auto& j : value) {
        j.second = j.second + 1;
        std::cout << "j:  " << j.second << std::endl;
    }
}

int main() {

    //initialize a map of maps
    std::map<std::string, std::map<std::string, int>> names = {{"women",{{"Rita",2}}},{"men",{{"Jack",4}}}};

    for(auto& index : names) {
        incrementAndPrintIt(index.second);
    }
    return 0;
}

Вы должны признать: это намного проще, не так ли?

...