双向迭代器

若p和p1都是双向迭代器,则可对p、p1可进行以下操作:
++p, p++ 使p指向容器中下一个元素
--p, p-- 使p指向容器中上一个元素
* p 取p指向的元素
p = p1 赋值
p == p1 , p!= p1 判断是否相等、不等

随机存取迭代器

双向迭代器的所有操作
p += i 将p向后移动i个元素
p -= i 将p向向前移动i个元素
p + i 值为: 指向 p 后面的第i个元素的迭代器
p - i 值为: 指向 p 前面的第i个元素的迭代器
p[i] 值为: p后面的第i个元素的引用
p < p1, p <= p1, p > p1, p>= p1
p – p1 : p1和p之间的元素个数

vector 随机访问
deque 随机访问
list 双向
set/multiset 双向
map/multimap 双向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器

顺序容器详解

顺序容器
vector 可变数组,支持快速随机访问,在尾部之外的位置插入或删除元素非常慢
deque 双向队列 支持快速随机访问,在头尾插入、删除速度很快
list 双向链表, 只支持双向顺序访问
forward_list 单向链表, 只支持单向链表顺序访问,在任何插入、删除都很快
array 固定数组大小 支持支持快速随机访问,不能添加或者删除元素
string 与vector 相似,专门用于字符,随机访问快,在尾部插入、删除速度快
每个容器类型都定义了默认构造函数,除array以外,其他容器的默认构造函数都会创建一个指定类型的空容器,且都可以接受指定容器大小和元素初始值的参数
元素定义及输出化
C c;默认构造函数,如果C是一个array,则中元素按默认方式初始化,否则c为空
C c1(c2) ; c1初始化为c2的拷贝(必须相同类型)
C c1=c2;同上
C c{a,b,c...} 或C c = {a,b,c...} 列表中的元素类型必须与C的元素类型相容。对于array ,元素数目小于或等于array 的大小,任何遗漏的元素都进行值初始化
C c(b,e) c初始化为迭代器b和e指定范围的拷贝。范围内的元素必须与C的元素相容(可以通过过转化实现)(对array 不适用0-)
只有顺序容器,不包括array 的构造函数才能接受大小参数
C seq (n) seq 包含 n 个元素,这些元素都进行了值初始化;此构造函数是explicit的
C seq(n,t) seq 包含有n个初始化为t的元素
容器赋值运算
c1 = c2
c = {a,b,c....} 将c1中元素替换为初始化列表中元素的拷贝
swap(c1,c2)
c1.swap(c2)
assign 操作不适用于关联容器和array
seq.assigh(b,e) b,e为迭代器
seq.assigh(il) 将seq的元素替换为初始化列表中il的元素
seq.assign(n,t) 将seq的元素替换为n个值为t的元素

c.push_back()
c.push_front
c.insert(p,t)
c。intser(p,n,t)
c.insert(p,b,e)
c.insert(p,il)


c.emplcace_back()
c.emplace_front
c.emplace(p,t)





返回void
返回void
返回指向新添加的元素的迭代器
返回添加的第一个元素,若n为零,返回p
b,e为迭代器
返回添加的第一个元素的迭代器,若为空,返回p
il是一个元素之列表,返回指向第一个插入元素的迭代器










向一个vector ,string,deque 插入元素会使得所有指向容器的迭代器,引用,指针失效

push_back
push_front
insert成员





除array,forward_list外的所有顺序容器
list,forward_list,deque
vector,deque,list ,string






插入头部
注:vector,deque,string插入耗时,不推荐使用





删除元素

c.pop_back()
c.pop_front(_)
c.erase(p) p为迭代器
返回void,不支持forword_list
返回void ,不支持vector , string
返回一个指向最后一个元素之后的元素之后的迭代器,若p指向为元素,则返回尾后迭代器,若p指向尾后迭代器,结果未定义

c.erase(b,e) b,e 为迭代器
c.clear ()

返回指向最后一个被删元素的后一个元素的迭代器,若e是尾后迭代器,则返回尾后迭代器
删除所有元素,返回void