STL 之 vector 详解

vector 简介

std::vector定义于头文件 <vector>,vector 是封装动态数组的顺序容器。其将元素保存在连续的内存空间中,支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢。

template<
   class T,
   class Allocator = std::allocator<T>
> class vector;

vector 构造方法

functiondetails
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;同上

常用成员函数

functiondetailscomplexity
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(countn) 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] << " ";
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值