C++ vector实现关键点和使用注意事项

时间:2022-02-12 20:33:36

       C++中vector是最常用的一个容器,本文参考《C++STL中文版》这本书中有关vector的章节,对vector容器的实现和应用做一些关键性的说明,便于读者对vector进行更好的掌握和运用。

1 vector实现的关键点

(1)元素存储空间的增长方式,建议使用参考书籍的增长方式,每次增长的空间至少是原来空间的一半,即N=(N+N/2),注意存储空间利用率和当元素增长时程序的运行性能之间的平衡。

(2)实现时vector内的成员对象只有一个内存分配器对象和三个指向元素储存空间的指针(First、Last和End)。

(3)vector的特例化模板vector<bool>的存在主要是对于bool类型的元素存储和操作时在空间和时间上的优化。

(4)vector一般保留一个大小大于实际所需大小的数组空间,多余的存储空间在成为有效数组的一部分前保持为未构造状态。

(5)插入insert元素时需要移动元素的位置,移动时需要注意内存重叠,使元素的拷贝移动方向与元素的增长方向相反可解决内存重叠问题。

2 vector使用注意事项:

(1)max_size函数返回的是vector中的内存分配器allocator能够分配的最大内存空间,即vector所能管控的最大序列长度,注意和capacity的区别。

(2)resize重新调整大小,既可以减小也可以增加size(数组的有效长度),但是内存并不一定减小。

(3)insert是在所指的元素之前进行插入,erase返回的迭代器指向被最后删除的元素的下一个元素。

(4)注意插入和删除元素后迭代器失效的问题。

(5)当预先知道所需的存储空间时,可以使用reserve预先分配内存。

(6)vector对象作为一个高效的栈使用时,应该让容器保持一定的预留存储空间,频繁的重新分配内存会影响栈的性能,可以使用reserve预分配内存,使用push_back、pop_back和back插入、删除和读取最后一个元素。

(7)clear只是保证了析构所有的元素,即size()=0,但并不保证释放所有的存储空间,即capacity不一定等于0,可以使用如下方式释放所有内存:

           vec.swap(vector<T>());

3 内存分配器allocator四个主要成员函数和功能简介

(1)allocate:内存分配,仅分配内存,不构造对象。

(2)deallocate:内存释放, 仅释放内存,不析构对象。

(3)construct:在已分配的内存空间中构造对象,仅构造对象。不分配内存。

(4)destroy:在已分配的内存空间中析构已构造的对象,仅析构对象,不释放内存。

(5)调用顺序:allocate->construct->destroy->deallocate。

附图片:vector insert函数实现关键点(内存空间的增长方式选择)

      https://img-blog.csdn.net/20170221171715448