c++ vector insert问题! 为什么一用insert就出错

源程序如下,能帮我找下错误吗#include<iostream>#include<vector>usingnamespacestd;classA{public:inta;... 源程序如下,能帮我找下错误吗
#include<iostream>
#include<vector>
using namespace std;
class A
{
public:
int a;
A(int aa){a=aa;}
void print(){cout<<a<<endl;}
};
int main()
{
vector<A> v;
vector<A>::iterator p=v.begin();
A aaa(4);
A bb(6);
v.push_back(aaa);
v.push_back(aaa);
v.push_back(aaa);
v.push_back(aaa);
p++;
p++;
v.insert(p,bb);
for(int i=0;i<5;i++)
v[i].print();
}
能加上vector的各个函数用法的详细解释的话更好,感激不尽!
展开
 我来答
luosiyong
2011-10-28 · TA获得超过3256个赞
知道大有可为答主
回答量:1090
采纳率:0%
帮助的人:1624万
展开全部
vector<铅弯A>::iterator p=v.begin(); //这个时候v是empty,p是空的
A aaa(4);
A bb(6);
v.push_back(aaa);
v.push_back(aaa);
v.push_back(aaa);
v.push_back(aaa); //运行到这里p依然是空的!
p=v.begin(); //p在这里重新赋值就可以了……

用法陵猜是对的,只是你槐汪闷的逻辑出了错误

关于STL容器,请查看网站:
http://www.cplusplus.com/reference/stl/vector/
追问
能留个联系吗,以后有问题方便问。。。。。
准备学习c/c++。。
追答
这就需要了解vector的内部实现了,vector在push_back的时候,如果空间不够了,会resize的,resize的时候,vector内部的数据会扩充,必要的时候,会迁移,如果数据不在原来的内存地址了,p虽然还是指向的begin,但是那段数据已经无效不可读了。
参考这段代码体会一下:
int main()
{
vector v;
//v.reserve(6); //这里先让vector保留6个空间,空间足够在本例中数据不会再扩充,如果没有这句,本段程序就崩溃
vector::iterator p;
A aaa(4);
A bb(6);
v.push_back(aaa);
v.push_back(aaa);
p=v.begin();
v.push_back(aaa);
v.push_back(aaa);

p++;
p++;
v.insert(p,bb);
for(int i=0;i<5;i++)
v[i].print();
tattackor
2015-10-29 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:886万
展开全部

1、insert是stl的容器插入函数。不同容器有不同用法。
vector容器的液尘insert函斗姿数定义说明,vector 的insert函数用三种用法,分别是
iterator insert (iterator position, const value_type& val);
参数:迭代器插入位置,值地址引用内容空埋绝。返回:迭代器
void insert (iterator position, size_type n, const value_type& val);
参数:迭代器插入位置,元素个数,值地址引用。返回:空
void insert (iterator position, InputIterator first, InputIterator last);
参数:迭代器插入位置,待插入起点迭代器,待插入终点迭代器。返回:空
2、例程:

// inserting into a vector
#include <iostream>
#include <vector>
int main ()
{
 std::vector<int> myvector (3,100);
 std::vector<int>::iterator it;
 it = myvector.begin();
 it = myvector.insert ( it , 200 );
 myvector.insert (it,2,300);
 // "it" no longer valid, get a new one:
 it = myvector.begin();
 std::vector<int> anothervector (2,400);
 myvector.insert (it+2,anothervector.begin(),anothervector.end());
 int myarray [] = { 501,502,503 };
 myvector.insert (myvector.begin(), myarray, myarray+3);
 std::cout << "myvector contains:";
 for (it=myvector.begin(); it<myvector.end(); it++)
   std::cout << ' ' << *it;
 std::cout << '\n';
 return 0;
}

输出:
myvector contains: 501 502 503 300 300 400 400 200 100 100 100   


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小 o
2012-02-25 · 知道合伙人IT服务行家
小 o
知道合伙人IT服务行家
采纳数:11 获赞数:161
深圳市奥斯恩净化技术有限公司 技术负责人 珠海创新人才奖

向TA提问 私信TA
展开全部
同意wo370506875的说法,这个燃明运不是用不用v.reserve(6)的问题,是p的位皮梁置已经改变了,你只要在p++;
p++;
的前面加上一句p=v.begin();
问题就不是问题!
luosiyong 提槐烂供的网站非常好哦! (http://www.cplusplus.com/reference/stl/vector/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式