我有以下地图:
std::map<std::string, std::vector<int> > my_map;
我以这种方式在地图中插入键和值:
my_map.insert( std::pair<std::string, std::vector<int> >(nom,vect) );
如何打印地图的键和值?
我已经测试过:
for( std::map<std::string, std::vector<int> >::iterator ii=my_map.begin(); ii!=my_map.end(); ++ii)
{
std::cout << (*ii).first << ": " << (*ii).second << std::endl;
}
但出于某种原因我得到了这个错误:
error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘std::vector<int>’)
std::cout << (*ii).first << ": " << (*ii).second << std::endl;
答案 0 :(得分:3)
首先,使用typedef
(或更现代的方法using
):
typedef std::vector<int> ivector;
typedef std::map<std::string,ivector> sivmap;
sivmap my_map;
// now benefits of using synonyms
my_map.insert( sivmap::value_type(nom,vect) );
// or even easier
my_map.insert( std::make_pair(nom,vect) );
// for loop is less verbose as well
// when there is no intention to modify data use const_iterator
for( sivmap::const_iterator ii=my_map.begin(); ii!=my_map.end(); ++ii)
{
std::cout << ii->first << ": " << ii->second << std::endl;
}
现在让你的循环工作创建运算符
std::ostream &<<( std::ostream &out, const ivector &iv )
{
out << '[';
for( ivector::const_iterator it = iv.begin(); it != iv.end(); ++it ) {
if( it != iv.begin() ) out << ", ";
out << *it;
}
return out << ']';
}
这不仅会使您的代码更短,更简洁,而且更容易出错,更易于阅读和修改
答案 1 :(得分:2)
嗯,这是因为operator<<
没有std::vector<int>
,这使得这种稀有的C ++编译错误非常易于理解和简洁。就像您使用迭代器为std::map
编写自己的输出一样,您需要为std::vector
执行类似的操作。
标准没有为我们做这件事的一个原因是人们可能希望输出出现的无限种格式。例如,如果您希望数据被(
和{{包围1}}和每个由)
和空格分隔的两个元素,更容易让你作为用户在几行中实现这一点,而不是制作允许这样做的算法,而且还要在单独的地方打印每个元素小数点上的对齐线和缩进,用于递归打印矢量矢量,这是其他人可能想要的。
出于同样的原因,建议您在需要的地方格式化矢量,而不是实际为它实现,
。如果要在程序的多个点中对相同类型的向量使用相同的打印机制,并希望能够将其写为operator<<
,那么最好的方法是创建一个公开扩展的类。 std::cout << vector << '\n'
,如
std::vector<int>
通过这种方式,您可以以正常class printable_vector : public std::vector<int> {
using std::vector<int>::vector; // inherit constructors
// (all other public member functions are inherited automatically)
friend std::ostream& operator<< (std::ostream& os, const printable_vector& vector) {
// do the actual printing to os...
return os;
}
};
的任何方式操作printable_vector
,但它也提供输出功能。
答案 2 :(得分:1)
你需要为bucle添加另一个来解决这个问题:
#include <map>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main()
{
std::map<std::string, std::vector<int> > my_map;
string nom = "carlitos";
vector<int> vect;
vect.push_back(1);
vect.push_back(2);
vect.push_back(3);
vect.push_back(4);
my_map.insert( std::pair<std::string, std::vector<int> >(nom,vect) );
for( std::map<std::string, std::vector<int> >::iterator ii=my_map.begin(); ii!=my_map.end(); ++ii)
{
for( std::vector<int>::iterator iii=(*ii).second.begin(); iii!=(*ii).second.end(); ++iii)
{
std::cout << (*ii).first << ": " << *iii << std::endl;
}
}
}
(这是因为std::cout
不会通过运营商std::vector
直接打印<<