C++学习笔记STL(Standard Template Library)标准模板库-顺序容器-动态的连续数组(vector)

std::vector

vector的存储时自动管理的,按需扩张。vector通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。vector所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配,分配的内存总量可用capacity()函数查询。额外内存可通过对shrink_to_fit()的调用返回给系统。重分配通常时性能上有开销的操作。若元素数量已知。则reserve()函数可以用于消除重分配。

vector 上的常见操作复杂度(效率)如下:

  • 随机访问——常数 O(1)
  • 在末尾插入或移除元素——均摊常数 O(1)
  • 插入或移除元素——与到 vector 结尾的距离成线性 O(n)

一.元素访问

1.at访问指定的元素,同时进行越界检查,若不在容器范围内,则抛出std::out_of_range类型的异常C++学习笔记STL(Standard Template Library)标准模板库-顺序容器-动态的连续数组(vector)

 

 

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返回指向未尾的逆向迭代器,对应非逆向元素的前一元素,此元素为占位符。试图访问它导致未定义行为

C++学习笔记STL(Standard Template Library)标准模板库-顺序容器-动态的连续数组(vector)

 

 

三.容量

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   交换内容

上一篇:include 和 include "xxxx.h"的区别


下一篇:Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV