无法显示地图数据
Posted
技术标签:
【中文标题】无法显示地图数据【英文标题】:Can't display map data 【发布时间】:2015-07-10 05:53:48 【问题描述】:// Map created
std::map<int, std::vector<int>> _map;
// Key/Data inserted
_map.insert(std::pair<int, std::vector<int> >(0, i ));
// Display values [ERROR]
for (const auto &p : _map)
std::cout << "m[" << p.first << "] = " << p.second << '\n';
这是一个非常简单的程序,可以创建地图、插入值并通过遍历整个地图来显示键/对。 我可以显示地图键(p.first),但我无法显示数据值(p.second)。
错误 C2679:二进制“”类型右侧操作数的运算符(或没有可接受的转换)
【问题讨论】:
你认为 p.second 会返回什么?它返回一个整数向量,因此您需要编写一个内部 for 循环来遍历该向量并在那里打印整数。向量没有定义 我无法访问 p.second 值,那么如何使用它来创建嵌套循环?你能举个小例子吗?谢谢 您可以访问它。 std::cout 没有运算符 for(auto &pp : p.second) std::cout<<pp; 【参考方案1】:std::vector<int>
中的p.second
和标准库不会为vector
s 重载operator<<
,如错误消息所述。所以你必须添加一个内部循环来遍历vector
并打印它包含的值。
而不是...
std::cout << "m[" << p.first << "] = " << p.second << '\n';
...试试...
std::cout << "m[" << p.first << "] = ";
for (int n : p.second)
std::cout << ' ' << n;
std::cout << " \n";
【讨论】:
【参考方案2】:或者,您可以使用std::copy
打印p.second
的内容
std::copy(p.second.begin(), p.second.end(), std::ostream_iterator<int>(std::cout, " "));
对于更通用的解决方案,我建议使用出色的 C++ container pretty print library。该库使您的代码无需进一步更改即可工作:
std::cout << p.second << std::endl;
【讨论】:
我喜欢它是一个单行指令的事实。让我删除对这种方法的便利性的评论,以便以更中立的方式呈现它。【参考方案3】:您必须自己为std::vector
定义operator >>
template <typename T>
std::ostream & operator >>(std::ostream & out, const std::vector<T> & vec)
std::copy(vec.begin(), vec.end(), std::ostream_iterator<T>(out, " "));
return out;
添加此定义后,您的代码将按原样运行。
for (const auto & p : _map)
std::cout << "m[" << p.first << "] = " << p.second << '\n';
【讨论】:
以上是关于无法显示地图数据的主要内容,如果未能解决你的问题,请参考以下文章