charpter 9 顺序容器
本章内容为第三章的拓展内容。顺序容器类型提供了快速顺序访问元素的能力。
顺序容器概述
- 基本容器 vector/deque/list/forward_list/array/string
- vector,string 将元素保存在持续的内存空间。可以快速访问元素。但是在容器中间添加或删除元素会非常费时。
- list和forward_list可以在任何位置添加或删除元素,但不支持随机访问,额外开销大
- array 规定长度的数组
- 反向容器 reverse_iterator c,c.rbegin(),c.rend()//逆序迭代
容器常用
- 迭代器范围 [begin,end)
- 拷贝指定范围内的元素 vector
data(data2.begin(),data2.end()) - array用法:
array<type,size>
与普通数组的差别:普通数组不支持拷贝,array支持拷贝,数组类型匹配即可。不支持{}赋值。 - 容器的拷贝与赋值:
- 赋值=。容器类型必须相同。赋值运算后,两容器大小相等,均为右侧容器大小,亦可通过{}赋值,除了array
- swap(c1,c2)交换元素。容器类型必须相同,速度较拷贝快
- 替换操作
c.assign(begin,end)//c.assign(il)//c.assign(n,t)//
类型匹配即可(const* 与string亦可)
- 容器的大小操作:(1)容器的大小size();(2)容器的最大容纳元素数max_size();(3)容器是否为空empty();
顺序容器操作
- push_front 在容器首添加元素(list,deque)
- insert 在容器任意部位插入元素(vector,deque,list,string),
用法:
(1)seq.insert(iterator,xx)
插到迭代器位置之前。缺点耗时
(2)seq.insert(iterator,n,xx)
插108个
(3)seq.insert(iteratot,{xx,xx,xx,xx})
insert返回值为指向当前位置的迭代器 - 访问元素 front/bach首尾元素 value = a.front();//必须保证非空
- 删除元素 (array不满足该操作)
c.pop_back()、c.pop_front()
(vector,string 不支持破pop_front和push_front)c.clear()
c.erase(p)
// 删除迭代器指定元素。返回删除后位置迭代器。c.erase(b,e)
//删除迭代器b和e所制定范围内的元素。返回最后一个删除元素之后元素位置迭代器 、
- 改变容器元素的个数(array不支持该操作)
c.resize(size)
,若大小大于当前大小,则增加至容器尾部,若小于,则删除后部位容器元素。 - *添加/删除vector、string、deque元素将导致迭代器失效。.erase(),.insert()操作可以更新迭代器,因为其返回值为更新后位置迭代器。
- *不要保存end返回的迭代器。
end = c.end() 不建议
- 容器的容量.capacity()指在不分配新的内存空间的前提下,他最多可以保存多少元素;.reserve(n),分配n大小的内存空间
额外的strng操作
- 除了一般顺序容器构造方式,string还支持其他三个构造
string s(s2,index) // 从s2下标index开始拷贝
string s(s2,index,len) // 从s2下标index开始拷贝,长度为len
string s(cp,n) // 拷贝cp指向数组的前n个字符
- 注意,用静态数组构造string时,必须保证以’\0’结尾,或者指定个数,类似于string s(a,10)
- substr 操作 返回原始string的一部分拷贝,
s1.substr(0,5) //s1.substr(6)指从6到最后
- string 除了接受迭代器的insert和erase,还接受下标版本。即
insert(index,n,xx)
- .append() 在尾部添加,
.replace(range,arg)
,删除range范围内的字符,替换为arg
范围可用(index,n)或者迭代器(begin,end) - string的搜索操作
- s.find(s1) 返回值为string::size_type 型,即为无符号类型。第一次出现s1的下标。若无,则显示很大值 =string::npos
- s.refind(s1) 最后一次出现s1的下标
- s.find(s1,pose),从pose出开始查找
- string的比较 类似于c里的strcmp,s.compare(arg)返回0,正,负
- arg 参数可以为s2、(pos1,n1,s2)(pos1,n1,s2,pos2,n2)