STL容器简介以及迭代器介绍

1.STL容器

容器(container)是用于存放数据的类模板。在使用容器时,即将容器类模板实例化为容器类时,会指明容器中存放的元素是什么类型的。在容器中,可以存放基本类型的变量,也可以存放对象, 而对象或基本类型的变量被插入容器中时,实际插入的是对象或变量的一个复制品。

容器分为两大类,顺序容器和关联容器。
顺序容器有以下三种:可变长动态数组 vector双端队列 deque双向链表 list。之所以被称为顺序容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置插入,元素就会位于什么位置。

关联容器有以下四种:set、multiset、map、multimap。关联容器内的元素是排序的。插入元素时,容器会按一定的排序规则将元素放到适当的位置上,因此插入元素时不能指定位置。默认情况下,关联容器中的元素是从小到大排序(或按关键字从小到大排序)的,而且用<运算符比较元素或关键字大小。因为是排好序的,所以关联容器在查找时具有非常好的性能。

除了了以上两类容器外,STL 还在两类容器的基础上屏蔽一部分功能,突出或增加另一部分功能,实现了三种容器适配器:栈 stack队列 queue优先级队列 priority_queue

容器都是类模板,实例化后就成为容器类,用容器类定义的对象称为容器对象。例如,vector<int>是一个容器类的名字,vector<int> a就定义了一个容器对象 a,a 代表一个长度可变的数组,数组中的每个元素都是 int 类型的变量。

任何两个容器对象,只要它们的类型相同,就可以用 <、<=、>、>=、==、!= 进行词典式的比较运算。假设 a、b 是两个类型相同的容器对象,这些运算符的运算规则如下。

a == b:若 a 和 b 中的元素个数相同,且对应元素均相等,则a == b的值为 true,
否则值为 false
a<b:规则类似于词典中两个单词比较大小,从头到尾依次比较每个元素,如果 a 中的元素小于 b 中的元素,
则a<b的值为 true。如果 b 中的元素没有小于 a 中的元素,但 a 中的元素个数比 b 少,a<b的值也为 true。
其他情况下值为 false。元素比较大小是通过<运算符进行的。
a != b:等价于 !(a == b)。
a > b:等价于 b < a。
a <= b:等价于 !(b < a)。
a >= b:等价于 !(a < b)

所有容器都有的成员函数:
int size():返回容器对象中元素的个数。
bool empty():判断容器对象是否为空。

顺序容器和关联容器还有以下成员函数:
begin():返回指向容器中第一个元素的迭代器
end():返回指向容器中最后一个元素后面的位置的迭代器
rbegin():返回指向容器中最后一个元素的反向迭代器。
rend():返回指向容器中第一个元素前面的位置的反向迭代器
erase(…):从容器中删除一个或几个元素。该函数参数较复杂,此处省略
clear():从容器中删除所有元素
如果一个容器是空的,则 begin() 和 end() 的返回值相等,rbegin() 和 rend() 的返回值也相等

顺序容器还有以下常用成员函数
front():返回容器中第一个元素的引用
back():返回容器中最后一个元素的引用
push_back():在容器末尾增加新元素
pop_back():删除容器末尾的元素
insert(…):插入一个或多个元素。该函数参数较复杂,此处省略

2.迭代器

迭代器是一个变量,相当于容器和操纵容器的算法之间的中介,迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。
2.1 迭代器按照定义方式分成以下四种
1)正向迭代器,定义方法如下

容器类名::iterator  迭代器名;

2)常量正向迭代器,定义方法如下

容器类名::const_iterator  迭代器名;

3)反向迭代器,定义方法如下

容器类名::reverse_iterator  迭代器名;
  1. 常量反向迭代器,定义方法如下
容器类名::const_reverse_iterator  迭代器名;

通过迭代器可以读取它指向的元素,*迭代器名就可以访问迭代器指向的元素,通过非常量迭代器还能修改其指向的元素内容。

迭代器都可以进行++操作。反向迭代器和正向迭代器的区别在于:对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素,而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。

2.2 迭代器按功能强弱分为输入、输出、正向、双向、随机访问五种
不同容器的迭代器,其功能强弱有所不同,而容器的迭代器的功能强弱,决定了该容器是否支持 STL 中的某种算法。例如,排序算法需要通过随机访问迭代器来访问容器中的元素,因此有的容器就不支持排序算法。
1)输入迭代器:将容器中的信息读取到程序中的迭代器,利用*迭代器名可以读取容器的信息,但不一定能让程序修改值,因此需要输入迭代器的算法将不会修改容器的值。
输入迭代器多次遍历容器可能会按不同顺序,并且输入迭代器递增之后,也不能保证输入其先前的值仍然可以解除引用。
支持++运算符(前缀和后缀格式),并且输入迭代器是单向迭代器,可以递增但不能倒退。

2)输出迭代器:将信息从程序传递到容器的迭代器,利用*迭代器名可以修改容器的信息,但是不能读取。支持++运算符(前缀和后缀格式),并且是单向迭代器,可以递增但不能倒退。

因此,对于单通行、只读算法可以使用输入迭代器,对于单通行,只写算法,可以使用输出迭代器。

3)正向迭代器:只使用++运算符来遍历容器的迭代器,利用*迭代器名可以读取容器的信息,而非常量的正向迭代器还可以修改容器的信息,并且多次遍历容器的顺序是相同。正向迭代器拥有输入迭代器和输出迭代器的所有特性

4)双向迭代器:既能使用++运算符又能使用–运算符的迭代器,双向迭代器拥有正向迭代器的所有特性。

4)随机迭代器:拥有双向迭代器的所有特性并且添加了支持随机访问的操作,若 p 是一个随机访问迭代器,i 是一个整型变量或常量, 支持以下操作

p+=i:使得 p 往后移动 i 个元素。
p-=i:使得 p 往前移动 i 个元素。
p+i:返回 p 后面第 i 个元素的迭代器。
p-i:返回 p 前面第 i 个元素的迭代器。
p[i]:返回 p 后面第 i 个元素的引用。

不同容器的迭代器的功能

容器迭代器功能
vector随机访问迭代器
deque随机访问迭代器
list双向迭代器
set / multiset双向迭代器
map / multimap双向迭代器
stack不支持迭代器
priority_queue不支持迭代器
queue不支持迭代器
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴天stick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值