吐血整理,未经本人允许,不可转载。
一.关于Vector
1. 什么是vector?
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
2. vector与数组的区别?
- 内存中的位置
C++中数组为内置的数据类型,存放在栈中,其内存的分配和释放完全由系统自动完成;vector,存放在堆中,由STL库中程序负责内存的分配和释放,使用方便。 - 大小能否变化
数组的大小在初始化后就固定不变,而vector可以通过push_back或pop等操作进行变化。 - 初始化
数组不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值;而向量可以。 - 执行效率
数组>vector向量。主要原因是vector的扩容过程要消耗大量的时间。
功能上vector可以完成取代原生数组。
二.Vector的初始化与访问
使用前提:
#include <vector>
using namespace std;
vector 初始化方式:
1 vector<T> v1; //v1为空,执行默认初始化
2 vector<T> v2(v1); //v2中包含v1所有元素的副本
3 vector<T> v2=v1; //v2中包含v1所有元素的副本
4 vector<T> v3(n,val); //v3中包含n个重复元素,每个元素的值都是val
5 vector<T> v4(n); //v4包含n个重复执行了值初始化的对象
6 vector<T> v5{a,b,c...}; //包含初始化元素个数,每个元素被对应的赋予相应的值
7 vector<T> v5={a,b,c...}; //包含初始化元素个数,每个元素被对应的赋予相应的值
三.Vector相关函数
1. 迭代器 Iterators:
序号 | 指令 | 功能 |
---|---|---|
1 | iterator begin() | 返回指向容器头部的迭代器。 |
2 | iterator end() | 返回指向容器尾部的迭代器。 |
3 | reverse_iterator rbegin() | 返回指向容器尾部的反向迭代器。 |
4 | reverse_iterator rend() | 返回指向容器头部的反向迭代器。 |
5 | const_iterator cbegin() | 返回指向常量头部的迭代器。 |
6 | const_iterator cend() | 返回指向常量尾部的迭代器。 |
7 | const_reverse_iterator crbegin() | 返回指向尾部的常量反向迭代器。 |
8 | const_reverse_iterator crend() | 返回指向头部的常量反向迭代器。 |
注意:
1. 迭代器(iterator)的使用类似于指针的使用。要访问顺序容器和关联容器中的元素,需要通过迭代器进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。详细用法请参考官网或自行百度。
2. 反向迭代器(reverse iterator)是一种反向遍历容器的迭代器。
3. 常量迭代器(const_iterator):不能通过迭代器修改所指向的内容,但是迭代器本身指向可变。常量反向迭代器(const_reverse_iterator )也类似。
2. 大小与容量 Size and Capacity:
序号 | 指令 | 功能 |
---|---|---|
1 | int size() | 返回容器的大小(size)。 |
2 | int max_size() | 返回容器能持有的最大元素的个数(maximum size)。 |
3 | bool empty() | 判断容器大小(size)是否为空,容器大小为0返回true,否则返回false。 |
4 | void resize(int n, T val) | 重新调整容器大小(size),使其含有n个元素。当n大于现有元素数量,则多出的元素的值等于val。 |
5 | int capacity() | 返回容器的容量(capacity),该值大于等于max_size()获得的值,并在容量耗尽时自动扩大。 |
6 | void reserve(int n) | 调整容器容量(capacity)。当n大于容器大小(size)时,扩大容量使得其大于等于n。 |
7 | void shrink_to_fit() | 缩小容器的容量(capacity)使其适应其大小(size)。 |
注意:
1. 注意区分容器大小(size)和容器容量(capacity)。容器大小,指的是它实际所包含的元素个数;容器容量,指的是在不分配更多内存的情况下,容器可以保存的最多元素个数。一般情况下容量>=大小 。
2. 容器的大小一旦超过容量,vector会重新配置内部的存储器,导致和vector元素相关的所有reference、pointers、iterator都会失效。
3. 元素访问 Element access:
序号 | 指令 | 功能 |
---|---|---|
1 | T operator[int n] | 返回访问位置为n元素的引用,不做边界检查。T为初始化时容器元素的数据类型 |
2 | T at(int n) | 返回访问位置为n元素的引用,做边界检查。T为初始化时容器元素的数据类型 |
3 | T front() | 返回容器的首位元素的引用。 |
4 | T back() | 返回容器的末尾元素的引用。 |
5 | T* data | 返回指向容器内部用于存储其拥有元素的内存数组的指针。 |
注意:
1. operator[ ]和at的主要区别在于是否做边界检查。由于operator[ ]不做边界检查, 哪怕越界了也会返回一个引用,当然这个引用是错误的引用,如果不小心调用了这个引用对象的话,会直接导致应用退出。而由于at会做边界检查,如果越界,会抛出异常,应用可以try catch这个异常,应用还能继续运行。
2. 在空容器中调用front()和back()会出现未定义的行为。
4. 编辑 Modifiers:
序号 | 指令 | 功能 |
---|---|---|
1 | void assign(int n, T& x) | 设置容器中前n个元素的值为x。 |
2 | void assign(const_iterator first,const_iterator last) | 容器中[first,last)中元素设置成当前容器元素。 |
3 | void push_back( T &x) | 在容器尾部添加一个新元素x。 |
4 | void pop_back( ) | 删除容器的最后一个元素。 |
5 | iterator insert(iterator it, T& x) | 迭代器 it 指向元素前增加一个元素x,返回指向x的迭代器。 |
6 | iterator insert(iterator it,int n, T& x) | 迭代器 it 指向元素前增加n个相同的元素x。 |
7 | iterator insert(iterator it,const_iterator first,const_iterator last) | 迭代器 it 指向元素前插入另一个相同类型向量的[first,last)间的数据。返回新插入第一个元素的迭代器。 |
8 | iterator erase(iterator it) | 删除迭代器 it 所指向的元素。返回被删除的最后一个元素的后一个元素的迭代器。 |
9 | iterator erase(iterator first,iterator last) | 删除容量中[first,last)中元素。返回被删除的最后一个元素的后一个元素的迭代器。 |
10 | void swap(vector& x) | 交换两个同类型容器的数据。 |
11 | void clear() | 清空容器中所有元素。 |
12 | iterator emplace(const_iterator it ,T&x ) | 在迭代器 it 指向之前插入元素x,并返回指向x的迭代器。 |
13 | void emplace_back(T &x) | 在容器尾部添加一个新元素x,用法与push_back类似。 |
5.分配器 Allocator:
序号 | 指令 | 功能 |
---|---|---|
1 | allocator_type get_allocator() | 返回vector的内存分配器。 |
四.相关链接
- C++官方Vector解读:http://cplusplus.com/reference/vector/vector/
- C++官方手册:http://cplusplus.com/