std::vector
vector的存储时自动管理的,按需扩张。vector通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。vector所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配,分配的内存总量可用capacity()函数查询。额外内存可通过对shrink_to_fit()的调用返回给系统。重分配通常时性能上有开销的操作。若元素数量已知。则reserve()函数可以用于消除重分配。
vector 上的常见操作复杂度(效率)如下:
- 随机访问——常数 O(1)
- 在末尾插入或移除元素——均摊常数 O(1)
- 插入或移除元素——与到 vector 结尾的距离成线性 O(n)
一.元素访问
1.at访问指定的元素,同时进行越界检查,若不在容器范围内,则抛出std::out_of_range类型的异常
2.operator[]访问指定的元素,此运算符决不插入新元素到容器。通过此运算符访问不存在的元素是未定义行为。
3.front 访问第一个元素,c.front()等价于*c.begin();
4.back访问最后一个元素,c.back()等价于*sed::prev(c.end());
5.返回指向内存中数组第一个元素的指针.指针满足范围 [data(); data() + size())
始终是合法范围,即使容器为空(该情况下 data()
不可解引用)。
二.迭代器
1,begin/cbegin 返回指向起始的迭代器,若为空,则返回迭代器end().
2.end/cend返回指向未尾的迭代器,此元素未占位符;试图访问它导致未定义行为
3.rbegin/crbegin 返回指向起始的逆向迭代器,对应非逆向未元素,若为空,则返回迭代器等于rend()
4.rend/crend返回指向未尾的逆向迭代器,对应非逆向元素的前一元素,此元素为占位符。试图访问它导致未定义行为
三.容量
1.empty 检查容器是否为空,begin()==end().
2.size 返回容器的元素数, std::distance(begin(),end())
3.max_size 返回可以容纳 的最大元素,理论上的极限
4.reserve 预留存储空间,reserve(tp)增加容量大于或等于tp的值。若tp大于当前的capacity(),则分配新存储。否则该方法不做任何事;
注意:改方法不改变vector的size.
正确使用 reserve()
能避免不必要的分配,但不适当地使用 reserve()
(例如在每次 push_back()调用前调用它)可能会实际增加重分配的数量(通过导致容量线性而非指数增长)并导致计算复杂度增加,性能下降。例如,按引用接受任意 vector
并后附元素的函数通常不应在 vector
上调用 reserve()
,因为它不知道该 vector
的使用特征。
5.capacity 返回当前存储空间能够容纳的元素数;
6.shrink_to_fit 通过释放未使用的内存减少内存的使用;它是减少capacity()到size()非强制性请求。
四.修改器
1.clear 清除元素,调用后size()返回0.
2.insert 插入元素,可以插入元素到指定位置。
3.emplace 原位构造元素;
4.erase 擦除元素,
5.push_back 将元素添加到容器未尾
6.emplace_back 在容器未尾就地构造元素
7.pop_back 移除未元素
8.resize 改变容器中可存储元素的个数
9.swap 交换内容