vector中下标操作符与push_back的一些疑惑 30
请大侠看下面的简要代码:vector<int>v;v.reserve(2);v.push_back(1);v[1]=2;v.reserve(100);cout<<v[0]...
请大侠看下面的简要代码:
vector<int> v;
v.reserve(2);
v.push_back(1);
v[1] = 2;
v.reserve(100);
cout << v[0] << endl; //这里能够打印出是原来的1
cout << v[1] << endl; //这里却不能打印出原来的2
小弟看了Exceptional C++ Style中的解释,
书上是这样说的:reserve(100),导致了vector的内存的重新分配,但是这个时候v只会把它确实拥有的元素复制到新家当中。对于vector的内存分配问题小弟很清楚,也看过STL原码剖析中的讲解,但是小弟不明白的是,为什么它这里只把push_back得到的元素认为是它确实拥有的,而[]却不是?希望得到大侠们的指导,小弟会追加50,诚心求教~
对不起啊,可能我没有说清楚,这个代码不一定能运行成功,我只是想用这个来表示我的意思,1楼所说的这些我都知道,但是reserver是改变容器容量的,容量跟大小(size)是不同的,这个我也知道,但是你可以去尝试着写我这样的代码,你会发现,用push_back加入的元素,在vector重新分配了以后,它被拷贝到了新的那块内存中了,可是用[]这个赋值的话却没有,这个就是我想要问的问题。所以1楼你没有理解我的意思,不过还是谢谢你的回答~~ 展开
vector<int> v;
v.reserve(2);
v.push_back(1);
v[1] = 2;
v.reserve(100);
cout << v[0] << endl; //这里能够打印出是原来的1
cout << v[1] << endl; //这里却不能打印出原来的2
小弟看了Exceptional C++ Style中的解释,
书上是这样说的:reserve(100),导致了vector的内存的重新分配,但是这个时候v只会把它确实拥有的元素复制到新家当中。对于vector的内存分配问题小弟很清楚,也看过STL原码剖析中的讲解,但是小弟不明白的是,为什么它这里只把push_back得到的元素认为是它确实拥有的,而[]却不是?希望得到大侠们的指导,小弟会追加50,诚心求教~
对不起啊,可能我没有说清楚,这个代码不一定能运行成功,我只是想用这个来表示我的意思,1楼所说的这些我都知道,但是reserver是改变容器容量的,容量跟大小(size)是不同的,这个我也知道,但是你可以去尝试着写我这样的代码,你会发现,用push_back加入的元素,在vector重新分配了以后,它被拷贝到了新的那块内存中了,可是用[]这个赋值的话却没有,这个就是我想要问的问题。所以1楼你没有理解我的意思,不过还是谢谢你的回答~~ 展开
展开全部
你这个代码本身就有问题,不应该能运行的= =。。。因为reserve并不更改vector的大小,这样你写v[1] = 2的时候程序应该出错。。。因为根本就不存在v[1],只有v[0]存在。reserve我基本不用,因为好像没有什么实际效果,因为reserve只增加vector的容量(capacity),但却没有增加大小,建议使用resize来代替。
在刚定义vector的时候,里面会默认为0个元素,一旦使用了push_back以后,那个元素就会被加进去,比如你这个v.push_back(1)就是把1加入到vector里面,那么这个vector的元素就由原来的{}(空的)变成了{1},如果再v.push_back(2)就变成{1,2}。push_back总是把新元素加在后面并且同时增加vector的容量和大小。
要想同时改变vector的容量和大小,你可以用push_back自动加,也可以用resize来自定义大小,比如v.resize(5)就是把这个vector的大小变成5。
如果你
v.resize(2);
v.push_back(1);
v[1] = 2;
那么这个vector的元素就变成{0,2,1}
cout << v[0] << endl; //这里的结果就是0
cout << v[1] << endl; //这里的结果就是2
在刚定义vector的时候,里面会默认为0个元素,一旦使用了push_back以后,那个元素就会被加进去,比如你这个v.push_back(1)就是把1加入到vector里面,那么这个vector的元素就由原来的{}(空的)变成了{1},如果再v.push_back(2)就变成{1,2}。push_back总是把新元素加在后面并且同时增加vector的容量和大小。
要想同时改变vector的容量和大小,你可以用push_back自动加,也可以用resize来自定义大小,比如v.resize(5)就是把这个vector的大小变成5。
如果你
v.resize(2);
v.push_back(1);
v[1] = 2;
那么这个vector的元素就变成{0,2,1}
cout << v[0] << endl; //这里的结果就是0
cout << v[1] << endl; //这里的结果就是2
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询