vector 简介
std::vector
定义于头文件<vector>
,vector 是封装动态数组的顺序容器。其将元素保存在连续的内存空间中,支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢。
template<
class T,
class Allocator = std::allocator<T>
> class vector;
vector 构造方法
function | details |
---|---|
vector<value_type> v; | 默认构造函数。构造空容器。 |
vector<value_type> v(size_type count); | 构造拥有7个元素的容器,并以默认值初始化。 |
vector<value_type> v = {val_1, ... val_n}; | 构造并初始化 |
vector<value_type> v(size_type count, value); | 构造拥有 count 个有值 value 的元素的容器 |
vector<value_type> v(iter_1, iter_2); | 构造拥有迭代器范围 [iter_1, iter_2) 内容的容器 |
vector<value_type> v(v2); | 构造和 v2 拥有相同内容的容器 |
vector<value_type> v = v2; | 同上 |
常用成员函数
function | details | complexity |
---|---|---|
void v.assign() | ➊v.assign(size_type count, value_type value) ,即将 count 个 value 赋值给 v,无论之前v是否为空,v将重新被初始化赋值,即之间的值都没了;➋v.assign(iter_1, iter_2) ,将迭代器[iter_1, iter_2)范围内的值赋给 v,此操作常用于将一个 vector 的内容赋值给另一个 vector,同样,无论之前v是否为空,v将重新被初始化赋值,即之间的值都没了 | ➊ O ( c o u n t ∗ n ) O(count*n) O(count∗n) ➋ O ( d i s t a n c e ( i t e r 1 , i t e r 2 ) ∗ n ) O(distance(iter_1, iter_2)*n) O(distance(iter1,iter2)∗n) |
v.at(size_type pos) | 返回位于指定位置 pos 的元素的引用(即元素值),有边界检查。若 pos >= v.size() 或pos<0则运行时会抛出异常 std::out_of_range | O ( 1 ) O(1) O(1) |
v[size_type pos] | 返回位于指定位置 pos 的元素的引用(即元素值)(但推荐用 at 方法访问),若 pos >= v.size() 或pos<0则返回随机值,不同于 map[ ] ,此运算符决不插入新元素到容器 | O ( 1 ) O(1) O(1) |
v.front() | 返回到容器首元素的引用,若容器为空,则会 Segmentation fault | O ( 1 ) O(1) O(1) |
v.back () | 返回到容器最后一个元素的引用,若容器为空,则会 Segmentation fault | O ( 1 ) O(1) O(1) |
v.data() | 返回指向作为元素存储工作的底层数组的指针。指针满足范围 [data(); data() + size()) 始终是合法范围,即使容器为空,通常用于遍历数组 | O ( 1 ) O(1) O(1) |
v.begin() | 返回指向容器首元素的迭代器,若容器为空,则返回 v.end() 。 | O ( 1 ) O(1) O(1) |
v.end() | 返回指向容器末元素后一元素 的迭代器 | O ( 1 ) O(1) O(1) |
v.empty() | 若容器为空则为 true ,否则为 false | O ( 1 ) O(1) O(1) |
v.size() | 返回容器中的元素数,即 std::distance(begin(), end()) | O ( 1 ) O(1) O(1) |
v.clear() | 从容器擦除所有元素。此调用后 v.size() 返回零。但保持 vector 的 v.capacity() 不变 | 与容器大小,即元素数成线性 |
v.insert() | ➊insert(iterator pos, value_type value) ,在 pos 前插入 value;➋insert(iterator pos, size_type count, value_type value) ; 在 pos 前插入 count 个 value;➌insert( iterator pos, iter_1, iter_2) ,在 pos 前插入来自范围 [iter_1, iter_2) 的元素 | ➊常数,加上 pos 与容器结尾的距离成线性; ➋与 count 成线性,加上 pos 与容器结尾的距离成线性; ➌与 std::distance(first, last) 成线性,加上 pos 与容器结尾的距离成线性 |
iterator v.erase() | ➊v.erase(iterator pos) ,移除位于 pos 的元素;➋v.erase( iter_1, iter_2) ,移除范围 [ iter_1, iter_2) 中的元素;操作后返回最后被移除元素的迭代器。迭代器 pos 指代最后元素,则返回 end() 迭代器 | O ( n ) O(n) O(n) |
v.push_back(value) | 赋 value 到容器尾,若新的 v.size() 大于 v.capacity() ,则所有迭代器和引用(包含尾后迭代器)都被非法化。否则仅尾后迭代器被非法化。 | 均摊常数 |
v.pop_back(value) | 移除容器的最末元素,在空容器上调用 pop_back(),则会 Segmentation fault | O ( 1 ) O(1) O(1) |
void v.swap(v2) | 交换两个容器的内容(类型必须向同)。不在单个元素上调用任何移动、复制或交换操作 | O ( 1 ) O(1) O(1) |
排序问题
排序可使用 algorithm 中的 sort 函数,默认升序排序
#include <algorithm>
#include <vector>
vector<int> v = {2, 23, 1, 34, 5, 6};
sort(v.begin(), v.end()); //升序排序
sort(v.rbegin(), v.rend()); //降序排序(利用反向迭代器)
遍历方式
指针遍历
value_type *p = v.data();
for (size_t n = 0; n < v.size(); n++, p++)
cout << *p << " ";
迭代器遍历
vector<value_type>::iterator it = v.begin();
for (; it != v.end(), it++)
cout << *it << " ";
auto (C++11)
for (auto &p : v) // &表引用,可通过 p 改变 v 的值
cout << p << " ";
for (auto p : v) // 不能通过 p 改变 v 的值
cout << p << " ";
// 仅遍历的话,建议使用后者
数组方式
for (size_t n = 0; n < v.size(); n++)
cout << v[n] << " ";