string与vector的下标使用

      C++ Primer 2006-12-7 20:47
问题一:string与vector的默认初始化
 
对于string,下面这段代码:
 
(假设已包含头文件和命名空间声明)
string s;       //空串,string头文件的构造函数定义未显式初始的string对象为空串“\0” 
cout<<s[0]<<endl;                                                                                          
 
运行结果: 
                  //即输出了空串的第一个字符“\0”,没有出现错误
 
而对于vector,类似的代码
 
vector<int> ivec;  //空整形容器,默认初始化为空,此处的空是没有元素的
                       是否也没有分配存储空间,这个现在还不知,第九章可能有答案
cout<<ivec[0]<<endl;                                                                
 
编译就会出现如图错误:
 

 
注:注意vector的默认初始化,如果可以应该显式初始化
 
问题二:string与vector的下标规则--只能访问已有元素,不能用于添加元素
 
下面这段程序对应string:
 
string s;    //empty string
for(string::size_type count=0;count!=10;cout++)
     s[count]='*';
cout<<s<<endl;
 
执行结果也是图示错误
原因在于下标只能用于访问已有元素(已初始化),for循环第一次执行,将“*”赋予s的第一个字符“\0”成功,但此时这个s并没有在“*”后面追加一个“\0”,已不是严格意义上的串,“*”是它的第一个字符也是最后一个,所以再次循环赋值给s[1]就会出错
 
可以修改如下:
string s;
for(int count=0;count!=10,count++)
   s+='*';
cout<<s<<endl;
 
用了字符串连接,每次连接后结束符“\0”自动后移,就不会出错
 
类似的,对于vector
 
vector<int> ivec;
for(vector<int>::size_type ix=0;ix!=10;++ix)
ivec[ix]=ix;
也会出错
而且这个for一次都没有顺利执行(string的例子顺利执行了一次),区别在于string和vector的初始化区别
 
可更正为:
 
for(vector<int>::size_type ix=0;ix!=10;++ix)
ivec.push_back(ix);
 
即可顺利执行
 
 
 
PS:原书体现了这一点,但讲的不甚详细
 
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}