现在的位置: 首页 > 综合 > 正文

【C++ Primer】笔记 顺序容器

2019年10月02日 ⁄ 综合 ⁄ 共 2237字 ⁄ 字号 评论关闭

顺序容器

顺序容器的定义

将单一元素类型聚集起来成为容器,然后根据位置来存储和访问这些元素
vector<int> ivec;
list<string>
slist;
deque<string> dstr;

三种顺序容器

vector   支持快速随机访问
list        支持快速插入/删除
deque 双端队列
差别:访问元素的方式,以及添加删除元素相关操作的运行代价不一样

顺序容器适配器

stack 
后进先出(LIFO)栈
queue 
先进先出(FIFO)队列
priority_queue
有优先级管理的队列

容器元素的初始化

C <T> c
创建一个名为c的容器。 C是容器类型名, 如 vector, T是元素类型, 如 int 、string。 适用于所有的容器。
C c(c2)
创建容器c2的副本c。 c2和c必须具有相同的容器类型,并且所存储的元素类型相同。适用于所有容器。
C c(b,e)
创建容器c, 其元素类型是迭代器b 和 e 标示的范围内的所有元素。适用于所有容器。
C c(n,t)
用n个值为 t 的元素创建容器c,其中值 t 必须为容器类型C的元素类型的值,或是可以转化为该类型的值。只适用于顺序容器。
C c(n)
创建有 n 个值初始化元素的容器c。只适用于顺序容器。

容器内元素类型的约束

1、 元素类型必须支持赋值运算
2、元素类型的对象必须可以复制
1、引用不支持一般意义的赋值运算,因此不能用作容器的元素类型
2、IO库类型不支持赋值和复制,因此不能用作容器的元素类型
容器的容器: 必须用空格隔开相邻的   > 符号  
//
example:
vector< vector<string> > svec;

迭代器和迭代器范围

*iter 返回迭代器 iter 所指向的元素的引用

iter->men 
对迭代器 iter 进行解引用,获取指定元素中名为mem的成员。

++iter
iter++
给迭代器+1,使其指向容器内的后一个元素

--iter

iter-- 
给迭代器-1 ,使其指向容器内的前一个元素

iter1 == iter2 

iter1 != iter2
比较两个迭代器是否指向同一个容器中的同一个元素或者同一个容器中末端的下一个位置 

vector 和 deque 容器的迭代器的额外运算

1、迭代器的算术运算
2、迭代器的关系操作符
iter + n 
iter - n
iter1 += iter2
iter1 - =iter2
iter1 - iter2
>,>=, <, <=

迭代器的范围

C++语言使用一对迭代器来标记 迭代器范围 。这两个迭代器必须指向同一个容器中的元素或者容器末端的下一个位置。

C++的迭代器范围是 左闭合区间 。 [ first, last )

顺序容器的操作

 容器定义的类型别名

size_type
iterator
const_iterator
reverse_iterator 
逆序迭代器
const_reverse_iterator
difference_type
足够存储两个迭代器差值的有符号整型,可为负数
value_type
元素类型
reference
元素的左值类型,是 value_type& 的同义词
const_reference

begin 和 end 成员

c.begin()
c.end()
c.rbegin()
返回一个逆序的迭代器,它指向容器 c 的最后一个元素
c.rend()
返回一个逆序迭代器,它指向容器c 的第一个元素的前面位置 

在顺序容器中添加元素

c.push_back(t)
c.push_front(t)
在容器c的前端添加一个元素,返回 void 。只适用于 list 和 deque 
c.insert(p, t) 
在迭代器 p 的前面插入元素 t ,返回新插入元素的迭代器
c.insert(p,  n,  t)
在迭代器 p 的前面插入n 个值为 t 的元素,返回值为 void
c.insert(p,  b, e)
在迭代器 p 的前面插入 由迭代器 b 和 e 所标记的元素,返回值为 void
Note: 不要存储 end 操作返回的迭代器。 

关系操作符

1、所有容器都支持用关系操作符来比较两个容器。
2、两个容器的类型以及容器内元素的类型必须相同。
3、容器的比较是基于容器内元素的比较。

容器大小的操作

c.size()
c.max_size()
c.empty()
c.resize(n)
c.resize(n, t)

访问元素

c.back()
c.front()
c[n] 只适用于vector、deque
c.at(n)
只适用于vector、deque

删除元素

c.erase(p)
c.erase(b, e)
c.clear() 
c.pop_back()
c.pop_front()
只适用于 list、deque

赋值与swap

c1 = c2 
删除容器 c1 的所有元素,将 c2 的元素复制给 c1 。两个容器的容器类型和元素类型必须一致
c1.swap(c2)
作用:交换内容。两个容器类型必须完全相同
c.assign(b, e) 
重新设置容器 c 的元素。首先将容器 c 的元素全部删除,用 迭代器 b 和 e 所标记的范围内的元素给 容器 c 赋值,迭代器 b 和 e 必须不是
指向容器 c中元素 的迭代器
c.assign(n, t)
将容器 c 重新设置为容纳 n 个元素  初值为 t 的容器 

vector容器的自增长

capacity : capacity操作获取在容器需要分配更多存储空间之前所能容纳的元素的个数
reverse : reverse操作告诉容器应该预留多少个元素的存储空间

容器的选用

1、除非找到选择其他容器的合适理由,否则选用 vector 容器是最好的选择

2、 如果无法确定选用那种容器,则应该使用vector 和 list 都支持的操作:使用迭代器,而不是使用下标操作,并且避免随机访问。

抱歉!评论已关闭.