[C++学习]迭代器iterator总结

描述

迭代器类似于指针类型,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是vector或者string中的元素或者字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。迭代器也有有效和无效之分,有效迭代器指向某个元素或者指向容器中尾元素的下一个位置,其余情况均为无效元素。

使用

auto b = v.begin(); // v的第一个元素
auto e = v.end(); // v的尾元素的下一个位置

end负责返回指向容器或string对象的尾元素的下一个位置,也就是说,该迭代器指示的是一个不存在的元素,该迭代器只是一个标记,没有实际含义,表示已经处理完了容器的所有元素,end成员返回的迭代器常被称作为尾后迭代器

1. 迭代器运算符

运算符 描述
*iter 返回迭代器iter所知元素的引用
iter->member 解引用iter所指元素的名为member的成员,等价于(*iter).member
++iter 令iter指向容器的下一个元素
--iter 令iter指向容器的上一个元素
iter1 == iter2 / iter1 != iter2 判断两个迭代器是否相等
举例:
string s("hello world!");
for (auto iter = s.begin(); iter != s.end(); ++iter)
{
    cout << *iter << endl;
}

2. 迭代器的类型

那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器类型:

vector<int>::iterator iter1;
string::iterator iter2;

vector<int>::const_iterator iter3;
string::const_iterator iter4;

上面两种迭代器类型的区别在于iterator能够读写,而const_iterator只能读。vector对象或string为常量时只能用const_iterator。

3. 解引用与成员访问

解引用可获得迭代器所指的对象,如果该对象恰好为类,就可能进一步访问它的成员。

例如,检查由string组成的vector对象需要检查其是否有元素值为空:

(*iter).empty(); // 正确写法
*iter.empty(); // 错误写法,iter是一个迭代器没有名为empty的成员

4. 无效的迭代器

此时使用迭代器会使迭代器无效:

  • 在for循环中向vector对象中添加元素;
  • 任何一种可能改变vector对象容量的操作;

但凡使用了迭代器的循环体,都不能向等待其所属的容器添加元素!!

5. 迭代器的运算

运算 描 述
iter + n 迭代器加上一个整数得到的仍然是迭代器,结果迭代器比原迭代器向前移动了若干元素。结果迭代器或者指向容器内的一个元素,或者指向容器内尾元素的下一个位置
iter - n 迭代器减去一个整数得到的仍然是迭代器,结果迭代器比原迭代器向后移动了若干元素。结果迭代器或者指向容器内的一个元素,或者指向容器内尾元素的下一个位置
iter += n 或 iter -= n iter加/减法的复合赋值语句
iter1 - iter2 两个迭代器相减得到的是它们之间的距离,参与运算的迭代器必须指向相同的容器的元素或者尾元素的下一个位置。

、>=、<、<= | 迭代器关系运算符,参与运算的迭代器必须指向相同的容器的元素或者尾元素的下一个位置。

posted @ 2019-09-18 18:32  Dumbledore  阅读(415)  评论(0编辑  收藏  举报