ошибка : в классе const std :: vector нет члена с именем first
std :: cout << it-> first << "" << it-> second.first << "\ n"; </p>
Это ясно, как Кристалл, что у вас может быть много элементов в ваших value
с вашей карты, которая является std::vector< std::pair<int, std::string>>
Тогда как бы вы распечатали элементы вектора? Варианты:
- произвольный доступ (т. Е.
vec[index]
)
- итератор (т. Е.
std::vector< std::pair<int, std::string>>::const_iterator itr;
)
- или по диапазону на основе цикла (т. Е.
for(const auto& it: vec)
)
В вашем случае, если вы хотите что-то простое и удобное, используйте цикл на основе диапазона:
for(const auto& it: cats)
{
std::cout << it.first << " = "; // keys
for(const auto& ve: it.second) // values vec
std::cout << ve.first << "-" << ve.second << "\t";
std::cout << std::endl;
}
Если вы все еще хотите иметь длинные iterator
петли, вот оно.
см. Прямую трансляцию здесь: https://www.ideone.com/3bS1kR
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <iterator>
typedef std::vector< std::pair<int, std::string>> Categories;
int main()
{
std::map<std::string, Categories> cats;
cats["key1"] = {std::make_pair(1, "pair1"), std::make_pair(1, "pair2"), std::make_pair(1, "par3")};
cats["key2"] = {std::make_pair(2, "pair1"), std::make_pair(2, "pair2")};
cats["key3"] = {std::make_pair(3, "pair1")};
std::cout << "Range based loop \n";
for(const auto& it: cats)
{
std::cout << it.first << " = "; // keys
for(const auto& ve: it.second) // values vec
std::cout << ve.first << "-" << ve.second << "\t";
std::cout << std::endl;
}
std::cout << "\nIterator loop \n";
std::map<std::string, Categories>::const_iterator it;
std::vector< std::pair<int, std::string>>::const_iterator curr_val_it;
for(it = cats.cbegin(); it != cats.cend(); ++it)
{
std::cout << it->first << " = "; // keys
for(curr_val_it = it->second.cbegin(); curr_val_it != it->second.cend(); ++curr_val_it )
std::cout << curr_val_it->first << "-" << curr_val_it->second << "\t"; // values vec
std::cout << std::endl;
}
return 0;
}