Ниже приведен мой код для создания map<int, vector<int>>
и печати:
//map<int, vector>
map<int, vector<int>> int_vector;
vector<int> vec;
vec.push_back(2);
vec.push_back(5);
vec.push_back(7);
int_vector.insert(make_pair(1, vec));
vec.clear();
if (!vec.empty())
{
cout << "error:";
return -1;
}
vec.push_back(1);
vec.push_back(3);
vec.push_back(6);
int_vector.insert(make_pair(2, vec));
//print the map
map<int, vector<int>>::iterator itr;
cout << "\n The map int_vector is: \n";
for (itr2 = int_vector.begin(); itr != int_vector.end(); ++itr)
{
cout << "\t " << itr->first << "\t" << itr->second << "\n";
}
cout << endl;
Печатная часть не работает из-за
error: C2678: binary '<<': no operator found which takes a left-hand operand of type
'std::basic_ostream<char,std::char_traits<char>>' (or there is no acceptable conversion)
2 ответа
Значением ваших карт (std::map<int, std::vector<int>>
) является вектор из int
s, и operator<<
не определено для печати std::vector<int>
в стандарте , Вам нужно перебрать вектор (то есть значения карты), чтобы напечатать элементы.
for (itr = int_vector.begin(); itr != int_vector.end(); ++itr)
// ^^ --> also you had a typo here: itr not itr2
{
cout << "\t " << itr->first << "\t";
for(const auto element: itr->second) std::cout << element << " ";
std::cout << '\n';
}
При этом, если у вас есть доступ к C ++ 11, вы можете использовать основанный на диапазоне для циклов . А в C ++ 17 вы можете сделать более интуитивно понятным структурированное связывание объявления для значения ключа карты:
for (auto const& [key, Vec] : int_vector)
{
std::cout << "\t " << key << "\t"; // print key
for (const auto element : Vec) std::cout << element << " ";// print value
std::cout << '\n';
}
Примечание . Как указывалось в комментариях @ Jarod42 , данный код можно упростить, если записи известны заранее.
Например, с помощью std::map::emplace
ing:
using ValueType = std::vector<int>;
std::map<int, ValueType> int_vector;
int_vector.emplace(1, ValueType{ 2, 5, 7 });
int_vector.emplace(2, ValueType{ 1, 3, 6 });
Или просто инициализируйте карту, используя std::initializer_list
конструктор из std::map
.
const std::map<int, std::vector<int>> int_vector { {1, {2, 5, 7}}, {2, {1, 3, 6}} };
ошибка: C2678: двоичный '<<': оператор не найден
Также означает, что вы можете написать свой собственный оператор. Это может быть удобно, поскольку ваши объекты становятся более сложными.
#include <iostream>
#include <vector>
#include <map>
using vector_int_type = std::vector<int>;
std::ostream& operator << (std::ostream& os, const vector_int_type& vect) {
for (const auto& i : vect)
os << '\t' << i;
return os;
}
int main()
{
std::map<int, vector_int_type> int_map;
int_map[1] = vector_int_type{ 1,2,3 };
int_map[2] = vector_int_type{ 4,5,6 };
for (auto& item : int_map)
std::cout << item.first << " is: " << item.second << std::endl;
}
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .