vector是顺序容器,元素线性排列,使用连续内存。因此我们可以使用元素指针经过算数运算来引用其它元素。例如
vector<string> strvec;
strvec.push_back ("Hello");
strvec.push_back ("World");
string *pptr = &strvec[0]; // pptr 指向“Hello”
pptr ++; // pptr 指向“World”
vector被实现为动态数组,内存在需要时自动分配。因此,在vector增加新元素时,老元素的地址是可能变化的。
1、头文件、名字空间和模板声明
头文件和名字空间
#include <vector>
using std::vector;
声明:
template < class T, class Allocator = allocator<T> > class vector;
可以看到vector模板有两个参数:T为元素类型,Allocator为内存分配器类。如果不指明内存分配器类型,则使用元素类型T的默认内存分配器类。
2、构造函数
// 默认构造函数,创建一个空的容器,其size = 0
explicit vector ( const Allocator& = Allocator() );
// 创建一个容器,初始放入n个值为value的元素。向量被实例化时,size = n
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
// 创建一个容器,并用迭代器进行初始化,从first到last,包含first但不包含last引用的元素。
template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );// 拷贝构造函数
vector ( const vector<T,Allocator>& x );
示例代码:
// 空向量
vector<int> empty_vec;
// 使用数量和值初始化向量。初始包含10字符串“Hello World”
vector<string> str_n_vec (10, "Hello World");
// 使用迭代器初始化向量。此向量有6个元素,不包含str_n_vec.begin () + 6引用的元素。
vector<string> str_ite_vec (str_n_vec.begin (), str_n_vec.begin () + 6);
3、迭代器函数
- begin:返回迭代器的开始
- end:返回迭代器的末尾(不能解引用)
- rbegin:返回一个反向迭代器的开始
- rend:返回一个反向迭代器的末尾(不能解引用)
vector<int> veci;
for (int i = 0; i < 10; i++)
veci.push_back (i);
for (vector<int>::reverse_iterator it = veci.rbegin ();
it != veci.rend (); it ++)
cout << *it << " ";
cout << endl;
4、容量函数
vector容量相关函数 | |
函数 | 说明 |
size | 返回vector中的元素数量 |
resize | 改变vector中的元素数量。如果参数大于当前size,则在尾部填充默认值或指定值;如果参数小于当前size,则自动放弃尾部的元素,以使元素数量等于参数。 |
max_size | 返回vector的最大容量 |
capacity | 返回vector目前分配内存的容量 |
reserve | 改变capacity,使capacity至少为参数n。此函数不影响vector的元素数量,即size返回的值。 |
empty | 判断vector是否为空。 |
5、元素访问
vector元素访问函数 | |
函数 | 说明 |
operator[] | 通过下标引用元素。注:下标不要越界,此函数不检查下标越界。相比较来说,使用迭代器要更安全。 |
at | 通过下标引用元素。与operator[]的区别为,此函数在下标越界时将抛出std::out_of_range异常。 |
front | 返回vector的第一个元素的引用。注,与begin不同,begin返回指向第一个元素的迭代器。注,如果vector为空,则此调用行为未指定。 |
back | 返回vector的最后一个元素的引用。如果vector为空,此函数调用行为未指定。 |
6、修改方法
vector修改方法 | |
函数 | 说明 |
assign | 为vector赋新值。原有元素直接舍弃。 |
push_back | 在vector尾部插入一个新元素。 |
pop_back | 删除尾部的一个元素。如果vector为空,调用此函数很危险。 |
insert | 在指定位置之前插入1个或多个元素。 |
erase | 删除1个或多个元素 |
swap | 交换两个数组的元素。 |
clear | 删除所有元素,并调用元素的析构函数。 |