#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]: 0xbb000Initial myVector.push_back capacity: 200
Initial myVector.push_back size: 101
pointer of Initial myVector[0] push_back : 0xbc1f0Capacity after resize(10): 200
Size after resize(10): 10
pointer after resize(10)[0]: 0xbc1f0push_back Capacity after resize(10): 200
push_back Size after resize(10): 11
pointer of push_back Size after resize(10)[0]: 0xbc1f0Final capacity after shrink_to_fit(): 11
Final size after shrink_to_fit(): 11
pointer after shrink_to_fit()[0]: 0x98130Final 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在操作容器时才有了相应的行为。