为什么调用了vector的clear()还是能正常输出数据?

在学习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]地址的元素覆盖掉;
一切就都说得通了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值