以下是我创建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)
答案 0 :(得分:6)
您地图的值(std::map<int, std::vector<int>>
是int
的向量,并且没有为打印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,则可以使用 range-based for loops 。在C ++ 17中,您可以更直观地对地图的键值进行 structured binding 声明:
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::map
的 std::initializer_list
constructor 初始化地图。
const std::map<int, std::vector<int>> int_vector { {1, {2, 5, 7}}, {2, {1, 3, 6}} };
答案 1 :(得分:2)
错误:C2678:二进制'<<':找不到运算符
也意味着您可以编写自己的运算符。随着对象变得越来越复杂,这样做很方便。
x