Итерация по вектору карт - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в изучении c ++, и у меня возникают проблемы при попытке перебрать мой код.

vector<map<string, char>> skills;
map<string, char> frontFloat;
map<string, char> frontGlide;

skills.push_back(frontFloat);
skills.push_back(frontGlide);

frontFloat["Wetface"]='C';
frontFloat["relaxed"]='C';
frontFloat["comfortable"]='I';

// ...

for (auto x : skills) {
   for (auto it=x.begin(); it!=x.end(); ++it){
      cout<< it->first << " => " << it->second << '\n';
   }
}

Я пытаюсь перебрать vector и далее перебирать каждый map в векторе.

Мой цикл for, похоже, ничего не печатает, и я поместил значения в карту. Пожалуйста, сообщите.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

В дополнение к ответу BoBTFish используйте индексы векторных элементов для манипулирования ими.

vector<map<string, char>> skills;
map<string, char> frontFloat;
map<string, char> frontGlide;

skills.push_back(frontFloat);
skills.push_back(frontGlide);

skills[0]["Wetface"]='C';
skills[0]["relaxed"]='C';
skills[0]["comfortable"]='I';

for (auto& x : skills) {
   for (auto& skillPair : x){
      cout<< skillPair.first << " => " << skillPair.second << '\n';
   }
}
0 голосов
/ 08 мая 2018
skills.push_back(frontFloat);
skills.push_back(frontGlide); //this will actually be stored as value not as reference. so the vector will contain only values from map at the pushing into the vector. But in your case you can push that as reference.

Ниже приведена небольшая модификация кода с указателем.

vector<map<string, char>*> skills; //here I'm storing the address of the map not the value.
map<string, char> frontFloat;
map<string, char> frontGlide;

skills.push_back(&frontFloat); //here i'm pushing the address to the vector.
skills.push_back(&frontGlide);

frontFloat["Wetface"]='C';
frontFloat["relaxed"]='C';
frontFloat["comfortable"]='I';

// ...

for (auto x : skills) {
   for (auto it=(*x).begin(); it!=(*x).end(); ++it){ //(*x) dereferencing the map address to the value.
      cout<< it->first << " => " << it->second << '\n';
   }
}
return 0;
}

Это будет работать в соответствии с вашими потребностями. И всякий раз, когда вы перебираете вектор, вы получите только текущие значения карты. Я надеюсь, что это поможет вам.

0 голосов
/ 08 мая 2018
skills.push_back(frontFloat);
// ...
frontFloat["Wetface"]='C';

Значение map, на которое вы установили WetFace, равно , а не , который находится внутри vector. Вы делаете копию из frontFloat внутри vector.

Таким образом, когда вы выполняете свои действия над map внутри vector, это не тот же map, в который вы устанавливаете элементы.

Чтобы добавить к карте, которая находится внутри vector, сделайте что-то вроде

skills.back()["WetFace"] = 'C';
...