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