C++一个小问题

#include<iostream>#include<vector>#include<string>usingnamespacestd;intmain(){vector<... #include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string *> spec;
string str;
while(cin >> str)
{
string *pstr=new string;
*pstr=str;
spec.push_back (pstr);
}
vector<string *>::iterator iter=spec.begin ();
while(iter!=spec.end ())
cout<<**iter<<'\t'<<(**iter++).size()<<endl;//cout<<**iter<<'\t'<<(**iter).size()<<endl,iter++;为什么不等价?
iter=spec.begin ();
while(iter!=spec.end())
delete *iter++;//为什么不是**iter
return 0;
}
展开
 我来答
flowercutsjia
2011-12-07 · 超过15用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:35.5万
展开全部
第一个问题:有关于cout执行顺序,举例:
int i = 0;
cout<<(++i) <<" , "<<(i+3)<<endl;
输出是: 4 , 3, 说明顺序为从右至左。对于你的程序:cout<<**iter<<'\t'<<(**iter++).size()<<endl; 编译器先 执行 (**iter++).size(),然后执行**iter,最后将程序输出。对于(**iter++).size(),执行过程为先对iter做两次dereference操作,即得到当前迭代器所指向的字符串指针的所指值,亦即第一个(假设循环从头开始)输入的字符串,然后.size()返回其大小。整条表达式执行完后,iter应该指向了下一个位置,亦即vector容器中第二个元素。那么,此时执行**iter即取出了第二次输入的字符串。所以整条语句在屏幕上的输出结果应该是:
第二个输入的字符串 \t 第一个字符串的大小
第3个... \t 第2个字符串的大小
....依次类推,但是到最后程序会出现问题,因为循环的最后输出了vector.end()的相对字符串值,这个值是没有定义的。
第二个问题: 这个问题比较简单。首先你要知道*iter 与 **iter 的区别。你的*iter是表示迭代器iter所指的容器vector中的值,亦即string* ;而**iter,如前所述,指的是string* 指针所指的值,亦即string。再往前看,你用string *pstr=new string;语句创建的是string*类型的,并保存在了容器spec中,当然相应的,程序结束后你要释放这部分内存。
ango365
2011-12-07 · TA获得超过213个赞
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:110万
展开全部
cout<<**iter<<'\t'<<(**iter++).size()<<endl;//cout<<**iter<<'\t'<<(**iter).size()<<endl,iter++;为什么不等价?
因为你的endl后面跟的是逗号所以不等价。如果是分号就等价了。
推荐使用后者,因为有些编译器会做优化,cout<<**iter<<'\t'<<(**iter++).size()<<endl;这种写法就有问题了。

while(iter!=spec.end())
delete *iter++;//为什么不是**iter
等价于
while(iter!=spec.end())
{
delete *iter;
++iter;
}
追问
你说的我明白。但是加分号不等价前者吧?该是等价逗号表达式。
while(iter!=spec.end ())
{
cout<<**iter<<'\t'<<(**iter).size()<<endl;iter++;
}
那个释放空间我是想知道为什么不是**iter,*iter表示的是啥意思
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式