#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> iVec;
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //1个元素, 容器容量为1
iVec.push_back(1);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //2个元素, 容器容量为2
iVec.push_back(2);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //3个元素, 容器容量为4
iVec.push_back(3);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //4个元素, 容器容量为4
iVec.push_back(4);
iVec.push_back(5);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //5个元素, 容器容量为8
iVec.push_back(6);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //6个元素, 容器容量为8
iVec.push_back(7);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //7个元素, 容器容量为8
iVec.push_back(8);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //8个元素, 容器容量为8
iVec.push_back(9);
cout << "容器 大小为: " << iVec.size() << "容器 容量为: " << iVec.capacity() << endl; //9个元素, 容器容量为16
/* 结论:
对于vc6集成的stl实现,vector背后的内存分配是按照2的倍数分配内存的。当当前容量对插入元素不够时,
分配一块新的内存,这块内存的容量是原vector容量的2倍大小,然后复制旧内存,释放旧内存,可能多次
涉及拷贝构造函数和析构函数,而这也正是vector的劣势所在。
*/
/* 测试effective stl中的特殊的交换 swap() */
cout << "当前vector 的大小为: " << iVec.size() << "当前vector 的容量为: " << iVec.capacity() << endl;
vector<int>(iVec).swap(iVec); //effective stl中的特殊交换,去除多余的空间。此处利用拷贝构造函数生成了一个临时的vector<int>对象
//cout << "临时的vector<int>对象的大小为: "<<(vector<int>(iVec)).size()<<endl;
//cout << "临时的vector<int>对象的容量为: "<<(vector<int>(iVec)).capacity()<<endl;
/* 说明什么呢? 说明拷贝构造函数临时生成vector<int>的对象时,只拷贝构造了原vector中有效的部
分,即vector<int>.size()个,而capacity代表的大小并没有都拷贝构造,因为那里面根本就没有对象,只是vector的内存分配策
略预先分配了一个相对元素个数更大的容量,以防止频繁拷贝和释放的负担。这样,swap后vector的大小和容量相等便很好理解了
。*/
cout << "交换后,当前vector 的大小为: " << iVec.size() << "交换后,当前vector 的容量为: " << iVec.capacity() << endl;
return 0;
}
vector 内存分配
最新推荐文章于 2024-06-27 15:30:06 发布