在学习C++的vector的时候意外地碰到了一个问题:
class Box {
private:
int length;
int width;
int height;
public:
Box(int length, int width, int height) : length(length), width(width), height(height) {}
void show() {
cout << "length : " << length << " width : " << width << " height : " << height << endl;
}
};
int main() {
vector<Box> boxOfBox;
Box box1(2,3,4);
Box box2(5,6,7);
Box box3(8,9,10);
boxOfBox.push_back(box1);
boxOfBox.push_back(box2);
boxOfBox.push_back(box3);
for(auto item : boxOfBox){
item.show();
}
boxOfBox.clear();
boxOfBox[0].show();//length : 2 width : 3 height : 4
boxOfBox[1].show();//length : 5 width : 6 height : 7
boxOfBox[2].show();//length : 8 width : 9 height : 10
return 0;
}
我本来以为最后的boxOfBox[0].show();等代码会不输出,因为clear()应该以及把它们“删除了”吧;
但结果是他们还能输出…
然后我发现,如果把最后的输出语句也换成
for(auto item : boxOfBox){
item.show();
}
的话就不输出任何东西。
随后我又把代码改成这样:
vector<Box> boxOfBox;
Box box1(2,3,4);
Box box2(5,6,7);
Box box3(8,9,10);
Box box4(16,17,18);
boxOfBox.push_back(box1);
boxOfBox.push_back(box2);
boxOfBox.push_back(box3);
for(auto item : boxOfBox){
item.show();
}
boxOfBox.clear();
boxOfBox.push_back(box4);//主要多了这个步骤
for(auto item : boxOfBox){
item.show();
}
boxOfBox[0].show();
boxOfBox[1].show();
boxOfBox[2].show();
的话就会输出
length : 16 width : 17 height : 18 //这个是for输出的,下面是boxOfBox[].show()输出的
length : 16 width : 17 height : 18
length : 5 width : 6 height : 7
length : 8 width : 9 height : 10
再结合网上已有的一些文章,我明白了,vector有两个属性size和capacity,capacity可以理解为空间,size就是大小,clear所做的只是把size清零,而空间里面的元素其实没有删除。
所以我最后的这行代码boxOfBox.push_back(box4);会把原来在boxOfBox[0]地址的元素覆盖掉;
一切就都说得通了。