vector扩容机制及扩容后数据地址变化
vector是STL中的动态数组。和数组不同,数组长度一旦确定就无法改变。而vector是可以灵活增加的。(可以不断地push_back())
1、size() 和capacity()
capacity()返回的是总的容量大小,size()返回的是使用的空间大小,capacity()-size()后就是未使用的空间大小
我们可以通过reserve来改变capacity(),resize()改变size(),如:
vector<int> customers;
cout << "***************reserve之后**************" << endl;
customers.reserve(10);
cout << "size = " << customers.size() << endl;
cout << "capacity = " << customers.capacity() << endl;
cout << "address of customers: " << &customers << endl;
cout << "****************resize之后**************" << endl;
customers.resize(10);
cout << "size = " << customers.size() << endl;
cout << "capacity = " << customers.capacity() << endl;
cout << "address of customers: " << &customers << endl;
最后得到的结果如下:
2、扩容机制
当vector中容量不够时,vector就自动会进行扩容。
不同的的编译器实现方式不同,vs中以1.5倍扩容,GCC以2倍扩容。
在扩容时,系统会选择一端更大的内存,将数据从原来的内存拷贝过来,同时释放原有的内存。这时数据存在的地址就发生了改变。我们可以通过&vector[0]的方式来查看数据首地址。
注意对于vector,&vector和&vector[0]是不一样的; 而对于数组,&array与&array[0]是一样的,如:
vector<int> customers = {1,2,3};
int a[3] = {1,2,3};
cout << "vector容器的地址: "<< &customers <<endl;
cout << "容器内部存的数据的首地址: " << &customers[0] << endl;
cout << "数组的地址: " << &a << endl;
cout << "数组内存的数据的首地址: " << &a[0] << endl;
cout << endl << "**************vector容器扩容*****************" << endl;
customers.push_back(4);
cout << "vector容器的地址: " << &customers << endl;
cout << "容器内部存的数据的首地址: " << &customers[0] << endl;
最后得到:
从结果上可以发现,扩容前后数据的首地址发生了变化,而&vector并没有发生变化。