关于vector<string*>,一个简短的C++程序,不知道为什么错了。

#include<iostream>#include<string>#include<vector>usingstd::cin;usingstd::cout;usings... #include<iostream>
#include<string>
#include<vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main()
{
size_t i=0;
vector<string*> pstr;
vector<string> str;
string word;
while(cin>>word)
{
str.push_back(word);
pstr.push_back(&str[i]);//经过我排查问题出现在此处,为什么?
i++;
}
vector<string*>::iterator iter=pstr.begin();
while(iter!=pstr.end()){
//cout<<str[ix]<<str[ix].size()<<endl;
cout<<**iter<<endl<<(**iter).size()<<endl;
iter++;
}
getchar();
}

还有一个问题,vector<string*> pstr;和vector<string> *pstr;有什么区别,如何解释。
展开
 我来答
小北娃
2012-03-13 · TA获得超过105个赞
知道小有建树答主
回答量:158
采纳率:0%
帮助的人:111万
展开全部
错误的原因是因为:
str.push_back(word); //此时在不断地插入新的节点时会导致内存重新分配,所以你的下一句保存上面的指针就没有意义了,因为上面的内存地址已经失效了。

建议你看下vector.push_back的源码就清楚了,vector本身是线性存储的,push_back会根据当前的容量来进行几何级数的膨胀,保存vector里面的地址的指针是没有意义的。除非你的vector稳定下来后你再保存就可以了。

vector<string*> 表示一个vector容器,容器里面的节点是一个string对象的地址(也就是一个int),这个容器可以存储很多个这样的节点。
vector<string> * pstr表示一个容器指针,这个容器指针所指向的容器里面的节点是一个string对象,同样,这个容器指针所指向的窗口也可以存储很多个string对象。
shenaodong
2012-03-13 · TA获得超过960个赞
知道小有建树答主
回答量:868
采纳率:0%
帮助的人:801万
展开全部
pstr.push_back(&word);//

vector<string*> pstr; 存放的是字符串指针
vector<string> *pstr; 存放的是字符串,而pstr是指针
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
臨九散人
2012-03-13 · 超过25用户采纳过TA的回答
知道答主
回答量:75
采纳率:0%
帮助的人:81.7万
展开全部
楼上的szbhzc回答的很不错了,如果想让这个程序正确运行,那么可以在创建str这个vector后就调用str.reserve(n)这个函数给vector预留n个元素的空间,那么在push_back时如果元素个数不超过n,str内元素的内存地址就不会发生改变。比如调用str.reserve(100),那么只要插入的元素个数不超过100,那么str元素的内存地址就不会改变。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式