vector的capacity和size

#include <iostream>
#include <vector>

int main() {
    // 创建一个包含 100 个元素的向量,每个元素初始化为 0
    std::vector<int> myVector(100);
    
    // 输出初始状态下的容量和大小
    std::cout << "Initial capacity: " << myVector.capacity() << '\n';
    std::cout << "Initial size: " << myVector.size() << '\n';
    std::cout << "pointer of Initial myVector: " << &myVector << '\n';
    std::cout << "pointer of Initial myVector[0]: " << &myVector[0] << '\n'<<'\n';

    myVector.push_back(1);
    // 输出添加状态下的容量和大小
    std::cout << "Initial myVector.push_back capacity: " << myVector.capacity() << '\n';
    std::cout << "Initial myVector.push_back size: " << myVector.size() << '\n';
    std::cout << "pointer of Initial myVector[0] push_back : " << &myVector[0] << '\n'<<'\n';

    // 将向量大小调整为 10,但此时容量不会改变
    myVector.resize(10);
    
    // 输出调整大小后的容量和大小
    std::cout << "Capacity after resize(10): " << myVector.capacity() << '\n';
    std::cout << "Size after resize(10): " << myVector.size() << '\n';
    std::cout << "pointer after resize(10)[0]: " << &myVector[0] << '\n'<<'\n';

    myVector.push_back(1);
    // 输出添加状态下的容量和大小
    std::cout << "push_back Capacity after resize(10): " << myVector.capacity() << '\n';
    std::cout << "push_back Size after resize(10): " << myVector.size() << '\n';
    std::cout << "pointer of push_back Size after resize(10)[0]: " << &myVector[0] << '\n'<<'\n';

    // 请求将容量缩小以适应新的大小
    myVector.shrink_to_fit();
    
    // 输出最终状态下的容量和大小
    std::cout << "Final capacity after shrink_to_fit(): " << myVector.capacity() << '\n';
    std::cout << "Final size after shrink_to_fit(): " << myVector.size() << '\n';
    std::cout << "pointer after shrink_to_fit()[0]: " << &myVector[0] << '\n'<<'\n';

    myVector.push_back(1);
    // 输出添加状态下的容量和大小
    std::cout << "Final push_back capacity after shrink_to_fit(): " << myVector.capacity() << '\n';
    std::cout << "Final push_back size after shrink_to_fit(): " << myVector.size() << '\n';
    std::cout << "pointer of push_back size after shrink_to_fit() myVector: " << &myVector << '\n';
    std::cout << "pointer of push_back size after shrink_to_fit() myVector[0]: " << &myVector[0] << '\n'<<'\n';
    return 0;
}

 

Initial capacity: 100
Initial size: 100
pointer of Initial myVector: 0x5ffe60
pointer of Initial myVector[0]: 0xbb000

Initial myVector.push_back capacity: 200
Initial myVector.push_back size: 101
pointer of Initial myVector[0] push_back : 0xbc1f0

Capacity after resize(10): 200
Size after resize(10): 10
pointer after resize(10)[0]: 0xbc1f0

push_back Capacity after resize(10): 200
push_back Size after resize(10): 11
pointer of push_back Size after resize(10)[0]: 0xbc1f0

Final capacity after shrink_to_fit(): 11
Final size after shrink_to_fit(): 11
pointer after shrink_to_fit()[0]: 0x98130

Final push_back capacity after shrink_to_fit(): 22
Final push_back size after shrink_to_fit(): 12
pointer of push_back size after shrink_to_fit() myVector: 0x5ffe60
pointer of push_back size after shrink_to_fit() myVector[0]: 0x94350

由运行结果可知:
1.vector的地址在其生命周期类不会改变,vector存储元素的地址会因为对vector操作而改变。

vector的地址和它存储元素的地址不同。

2.当capacity充足时,向vector中添加元素,不改变vector存储元素地址的改变。

3.当capacity不足时,向vector中添加元素,vector存储元素地址发生改变。这个过程刚好说明了,vector存储管理的特点,即当超出容量后添加元素,vector会重新申请一块更大的内存并将原来存储地址的数据拷贝到新地址。并且,我们还得知更新后的capacity为原来的两倍。

4.shrink_to_fit()也会改变vector存储元素的地址,也就说明了,这个函数的实际原理是重新申请一块刚好和size相等的内存,将原数据复制到新的地址。

值得注意的是,vector的地址和vector存储元素的地址是两个不同的概念。在内存管理中,内存是以块为单位分配和释放的,内存块一旦被分配,我们就无法改变它的大小。所以当原来内存块大小不够时,我们无法直接扩容这个内存块,只能重新申请一块更大内存块。同样的,我们也无法缩小已分配内存块的大小。需要与原来不同大小的内存时我们只能重新申请。因此,vector在操作容器时才有了相应的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值