C++学习笔记(二): 迭代器

来源:互联网 发布:cms监控软件下载 编辑:程序博客网 时间:2024/05/22 06:09
迭代器
每种容器都提供了若干共同工作的迭代器类型,与容器类型一样,所有迭代器都具有相同的接口, 即它们都支持某种操作

支持的操作有
*iter                  指向元素
iter->mem          解引用
++iter iter++       自增
--iter iter--          自减
iter1==iter2        判断相等
iter !=iter2          判断不等

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

它们支持的操作有
iter+n            迭代器加整数值, 这个含义表示,迭代器的地址相加,n表示iter所指向元素之后的第n个元素, 类似的还有
iter-n            
iter1 += iter2
iter1 -= iter2
iter1-iter2

>, >=, <, <=
关系操作符,只适用于vector和deque容器, 这是因为只有这两种容器为其元素提供快速随机的访问。

迭代器的范围
C++语言使用一对迭代器标记迭代器范围, 这两个迭代器分别指向同一个容器中的两个元素或超出末端的下一位置, 通常它们被命名为first和last, 或beg和end
对于 后一个迭代器, last或end, 它从来都不是指向容器的最后一个元素,而是指向最后一个元素的下一个位置。 
迭代器从  first开始,直到遇到last停止,可以访问这之间所有的元素。

此类元素范围称为 左闭合区间

使用左闭合区间的编程意义
保证了容器元素非空, 指向第一个元素,
保证了当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的第一个元素
c.end()       返回一个迭代器, 它指向容器c的最后一个元素的下一个位置
c.rbegin()  和 c.rend()是逆序操作的

上述每个操作  都有两套定义, 一个是返回给常量迭代器,一个是普通迭代器

在顺序容器中添加元素:  push_back
所有顺序容器都支持push_back操作, 提供在容器尾部插入一个元素的功能
每次向 容器中添加一个元素, 容器的长度自动增加一, 它是动态的

在顺序容器中添加元素的操作:
c.push_back(t)       在容器c的尾部添加值为t的元素
c.push_front(t)      在容器c的前端添加值为t的元素。
c.insert(p, t)          在迭代器p所指向的元素前面插入值为t的新元素,并返回指向新添加元素的迭代器
c.insert(p, n, t)      就是插入n个值
c.insert(p, b, e)      就是在迭代器所指向的元素前面插入 迭代器b到迭代器e之间范围的元素。

除了push_back运算, list和deque容器类型还提供了类似的操作:push_front。 这个操作实现在容器首部插入新元素的功能。

添加元素 可能导致迭代器失效
在vector容器中添加元素可能会导致整个容器的重新加载,这样的话,该容器涉及到的所有迭代器都会失效, 就是不再指向任何元素, 就像容器重新定义了迭代器。 

避免操作由end操作返回的迭代器
vector<int>::iterator first=v.begin(), last=v.end();

while(first != last)
{
     first = v.insert(first, 42);
     ++first;
}
这回导致整个程序的死循环。 因为当insert()时, 由于整个容器的所有迭代器重新加载,因此导致 last存储的迭代器失效,而没有指向容器的任何一个元素。

因此,应该改为如下代码:
while(first != v.end())
{
}

0 0
原创粉丝点击