为什么在C++中vector string对象不能直接输出,需要自己遍历,然后逐个输出.

如题所述

一个原因是标准库不知道怎样才是最合适的输出方式,比如每个元素间要不要用回车分隔,还是用逗号分隔,再说即使不能直接输出,写起来也很简单,如果是C++11的话,写成

for (auto&& i:text) cout << i <<' ';

就可以了


真的需要cout << text;这种写法的话,自己重载一个 operator<< 函数也是很轻松的事,因为你自己知道怎样输出最合适,以下就是在不用C++11的情况下,一个简单且可扩展的 operator<< 重载

std::ostream& operator<<(std::ostream& o, std::vector<std::string> const& v)
{
    for (std::vector<std::string>::iterator i=v.begin(), end=v.end(); 
         i != end;
         ++i)
    o << *i << ' ';
}

追问

还没学到重载运算符。
标准库没有办法输出模版中的string对象??是因为模版里的stiring对象有什么特性吗?????

追答

标准库当然能输出string,哪怕是模板类的string成员,因为 string 作为字符串,最合适的输出方式就是一个字符一个字符输出。

但是如果是多个字符串(或者其他东西),就不知道什么是最合适的输出方式(如上,一个问题是用什么作为分隔符)

这不是能不能做到的问题,而是知不知道如何做的问题

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-08-16
因为容器对象没有重载>>(输出)运算符!只有进行了运算符重载,才可以调用相应的类对象输出追问

这个操作数类型是什么意思呢??<<std::vector<std::string

追答

就是指<<运算符所对应的操作数据类型!
如:
+运算符对应的数据类型可以是 int double等,string类对象重载了+运算符,也就可以进行+运算了,如:
string s("abc"), t;
t=s+"d" ;
cout << t <<endl ; //输出abcd

第2个回答  2014-08-16
ostream operator<<(ostream& o, string& s);
那是因为标准C++输出流只对string类型等基础数据类型做了运算符重载,如果你需要把一整个数组的字符串输出,你可以自己重载运算符,因为vector后面的类型是不确定的,所以标准库不会去做这件事情。。。

为什么在C++中vector string对象不能直接输出,需要自己遍历,然后逐个...
一个原因是标准库不知道怎样才是最合适的输出方式,比如每个元素间要不要用回车分隔,还是用逗号分隔,再说即使不能直接输出,写起来也很简单,如果是C++11的话,写成 for (auto&& i:text) cout << i <<' ';就可以了 真的需要cout << text;这种写法的话,自己重载一个 operator<< 函数也是很...

c++中怎么输出整个向量,不用for循环,应该有函数。
这句话相当于把vector的元素扔到输出迭代器里面去 你说应该有函数,说明你自己也不确定。事实上,我不认为有这样的一个函数。即便有这样一个函数,那么它的实现也是for循环遍历向量,然后逐个输出。这个代码不会超过5行,你自己包装这样一个函数就可以了。

C++ vector<string> 输出问题
");for (vector<string>::iterator iter = svec.begin(); iter != svec.end(); ++iter){\/\/输出*iter才是输出那些字符串cout << *iter << endl;}getchar();return 0;}

C++中vector和string类是怎么实现输入的?
其实是用new运算符,new运算符用于分配堆空间。new的基本语法是"new 类型名";和"new 类型名[]"。前者分配单个对象,后者是比较数组的。还有其他的语法,我这里只说三种。第二种是带赋值的语法:"new 类型名(该类型的一个对象),用于赋值给分配到的空间;和"new 类型名[] { 该类型的对象的列序...

C++中用vector存放一个数组,对数组进行排序,并输出数组
while(cin>>word){ text.push_back(word);} 什么时候跳出循环?for(vector<string>::iterator iter=text.begin();iter!=text.end();++iter)sort(text.begin(),text.end());sort一次就可以了,循环迭代的目的什么?cout<<*iter<<endl;for循环结束后,iter指向text.end(), 里面不包含有效数据...

c++写dll,用了vector,不能写extern c了
可以把,,,试着把vector封装到类里面, dll中动态导出类的同时就可以调用vector了 常规是变量\\函数\\类对象,,,have a try ..

C++如何输出容器内类的对象的,代码如下?
生成器返回的应该是一个对象指针吧。cout不能直接输出对象数据,你得在对象里面加个输出<<的重载函数,友元函数。

c++ vector<string>用iterator遍历
试试以下代码#include <iostream>#include <vector>#include <string>using namespace std ;int main(){ string arr[4]={"hello","world","name","address"}; vector<string> ivec(arr,arr+4);for(vector<string>::iterator iter1=ivec.begin(); iter1!=ivec.end(); ++iter1 )...

c\/c++ 语言 map<string, vector<node> >怎样遍历vector
这个是不是map里面的string参数? 是的 it->second是map中对应于it->first的vector, 你这样的写法导致了复制,应该用引用。tmp[i] 是node变量。下面是一段简化的代码:include include <vector> include <iostream> struct Point { int x;int y;};std::ostream & operator <<(std::ostream...

...string类型的指针,读取该vector,输出每个string的值和长度
vector<string*> sp;string str;vector定义sp时用的是string* ;而你要存储的数据为 string类型 ;类型不匹配 (将vector<string*> sp改为vector<string> sp)在C++中,std::string 一般使用 string 形式,而不使用string * ;

相似回答