2016-12-02 65 views
1

我有以下地图:显示一个字符串,矢量<int>地图在C++

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

你怎么能打印'std :: vector '?你不能这样做,除非你通过为'operator <<'提供一个过载来定义它是如何被打印的。'' – user463035818

+0

你需要遍历'std :: vector ',或者在原地进行,或者通过重载'运营商<<'为这种类型(我不建议。) – Tobias

+0

该死的我是一个初学者,我真的不需要每个评论员在这个论坛downvote一篇文章,当他们找到答案很明显 –

回答

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 << ']'; 
} 

这不仅使你的代码更短,更简洁,但不容易出错,更易于阅读和修改

+0

我不是一个定义'using' typedef的输出运算符的忠实粉丝。当它只是一个别名时,它会发送一个将其定义为单独类型的错误消息。与另一个别名不同的输出例程会与此冲突。 –

+0

@TheVee这仅仅是一个例子,它可以很容易地更改为模板,它可以与任何矢量协同工作,我只是不想一次性将信息匹配到OP。 – Slava

2

嗯,这是因为没有operator<<std::vector<int>,使得这一个这种罕见的C++编译错误很容易理解和简洁。就像您使用迭代器为std::map编写自己的输出一样,您需要为std::vector执行类似的操作。

原因之一,该标准没有对我们做,这是无边的各种格式,人们可以期待的输出出现在例如,如果你想通过一个()包围的数据和每两个元素用,和一个空格隔开,则更容易要求您作为用户在几行内实现此操作,而不是制作允许该算法的算法,但也可以将每个元素打印在单独的行上,并使用小数点进行对齐,并使用缩进向量的矢量的递归打印,其他人可能需要。

出于同样的原因,建议您在需要它的地方格式化矢量,而不是实际执行它,并且为它设置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你可以正常std::vector<int>但它也提供了输出功能。

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; 
    } 
    } 
} 

Test!

(这是因为std::cout不会直接打印std::vector,通过运营商<<

相关问题