1、vector 本质:动态数组,里面有一个指针指向一个连续的内存空间。
2、自动申请空间机制:当空间不够存储数据时,会自动申请另一片更大的空间,然后把数据拷贝过去。但是当删除或者释放里面的数据时,其存储空间不会释放,只是将内容晴空而已,只有在析构函数调用时才能自动释放缓冲空间。同时每次扩容都是增加当前空间的50%(除去第1次)。
注:析构函数等效的替代方法,释放缓冲空间。
- //方法一
- {
- vector<int> temp;//临时对象未初始化,其缓冲区大小为0,没有数据
- arr.swap(temp);//与我们的对象交换数据,arr的缓冲区就没了。
- }//临时变量会被析构,temp调用vector析构函数释放空间
3、如何提高vector性能: 3种方式将数据存储到vector中,依次是:
3.1、直接每次push_back();
3.2、用resize()提前分配空间,然后再push_back();
3.3、用reserve()提前分配空间,然后再push_bck();
3.4、reserve只是保持最小的存储空间,而resiize()则是对存储空间重新分配,包括判断和内存比较比较多,当然如果最初空间就是空的就没有差别。
3.5、如果知道需要分配空间大小,则提前分配空间,然后再push_back()方法更加节省时间。且时间由1-3依次减少。
4、说一下resize()和reserve()的区别:
4.1、reserve()是容器预留空间,并不真正创建元素。在初始化元素之前,引用非法;需调用push_back()后才能调用数组内元素。
4.2、resize()改变容器大小,并且创建对象,调用这个函数后即可调用数组,例如赋值等操作,不需要push_back()后才能调用数组内元素。
- vector<int> myVec;
-
- myVec.reserve( 100 ); // 新元素还没有构造,
-
- // 此时不能用[]访问元素
-
- for (int i = 0; i < 100; i++ )
-
- ...{
-
- myVec.push_back( i ); //新元素这时才构造
-
- }
-
- myVec.resize( 102 ); // 用元素的默认构造函数构造了两个新的元素
-
- myVec[100] = 1; //直接操作新元素
-
- myVec[101] = 2;