第9章 顺序容器

9.1顺序容器概述

vector       大小可变的数组。支持快速随机访问,在非尾部插入或者删除元素较慢。

deque       双端队列。支持快速随机访问,在头尾插入删除速度很快。

list             双向链表,只支持双向顺序访问。在当前位置插入删除操作速度很快。

forward_list     单向链表。只支持单向顺序访问。在当前位置插入删除操作速度很快。

array         固定大小数组。支持快速随机访问,不能添加删除元素。

string        与vector类似的容器,专门用于保存字符。

容器操作

类型别名

iterator    此容器类型的迭代器类型

const_iterator

size_type

difference_type        元素距离类型

value_type       元素类型

reference                   元素的左值类型,同value_type &

const_reference

构造函数

C c;

C c1(c2);//使用c2所有元素的拷贝进c1

C c(b, e);//将迭代器b到e之间的元素拷贝到c(不支持array)。

C c{a, b, c, d};//列表初始化

赋值与swap、assign

c1 = c2;//将c1中的元素替换成c2中的元素

c1 = {a, b, c, d};//替换为列表

a.swap(b);//交换a、b的元素,元素本身并未交换,只是交换了内部的数据结构,所以很快

swap(a, b);//swap之前所有的迭代器指针都指向原来的位置,不属于交换后的容器了。String除外,array除外,交换后会失效。

c.sign(b, e);//将另一个容器中从b到e中的元素替换到c

c.assign( il );//将初始值列表元素替换到c

c.assign(n, t);//n个t替换到c中

大小

c.size();//不支持forward_list

c.max_size();//c可保存的最大元素数目

c.empty();//是否为空

添加删除(不适用array

c.insert(args);

c.emplace(inits);//其中写的是构造函数列表的参数,空则使用默认构造函数。

//通常,需要创建对象,然后将对象拷贝到容器中。emplace直接在容器中构造对象。

c.erase(args);//删除

c.clear();

 

关系运算

==、!=

<、<=、>、>=                   无序容器不支持

获取迭代器

c.begin(), c.end()

c.cbegin(), c.cend()

反向容器的额外成员,不支持forword_list

reverse_iterator      逆序迭代器,

const_reverse_iterator   逆序迭代器

c.rbegin(), c.rend()  逆序迭代器,begin得到最后一个元素,rend为首元素之前

c.crbegin(), c.crend()

9.3 顺序容器操作

添加元素

push_back(t)                                在尾部插入值

         emplace_back(args)         在尾部插入有参数初始化的元素

push_front

         emplace_front

insert(p_iterator,t)

         emplace(p_iterator,args)

insert(p_iterator,n_count,t)

insert(p_iterator,beg_iterator, end_iterator)

insert(p_iterator,{…})

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

Insert会返回当前插入位置,由于之前使用的当前位置可能会失效,所以再次向此位置插入时,已使用insert返回的当前位置。

访问元素

front                   返回容器的首元素的引用

back                   返回容器的尾元素的引用

在使用容器的时候,如果需要改变容器内的元素值,一定要使用引用。

删除元素

pop_back          删除尾元素

pop_front

erase(p_iterator)

erase(beg_iterator,end_iterator)

clear

forward_list

由于是单向链表,所有的操作只能在当前位置之后。

befor_begin     首元素之前

cbefor_begin

insert_after

emplace_after

erase_after

改变容器大小

resize(n_size);注意可能会删除后部元素,或使用默认初始化将元素添加到后部

resize(n_size, t);如果增大了容器,在后边全部填充t

capacity和size

capacity,能容纳多少元素,而不需要从新分配内存

size,当前容纳了多少元素

shrink_to_fit,将内存退回到size的大小

reserve,预分配capacity

额外的string操作

substr

append

replace

find

compare

数值转换

容器适配器

stack  :size pop top push empty这几个方法

queue   :size pop back front push empty这几个方法

priority_queue

适配器使得某种事物的行为,看起来更像另外一种事物。

对于给定的适配器,可以使用的容器是有限制的。

  1. 适配器要求能够增删元素,所以不能使用array容器
  2. stack只要求push_back、pop_back和back操作,可以使用array和forward_list之外的任何容器
  3. queue要求back、push_back、front和push_front因此,可以使用list或deque,不能vector
  4. priority_queue除了front、push_back、pop_back还要求随机访问的能力,因此可以构造与vector或者deque之上,但不能用list
原文地址:https://www.cnblogs.com/qiusuo/p/4542596.html