迭代器浅谈


引入

只有少数容器同时支持下标索引,所有标准库类型容器均支持迭代器
string类型虽然不是容器,但是拥有与容器相似方法,因此也支持迭代器

定义

迭代器可与其指向的容器中的元素建立关联,从而通过解引用来间接访问对应元素

迭代器类型

vector为例
vector::iterator 可读写访问迭代器指向元素
vector::const_iterator 常量类型的迭代器,只能访问迭代器指向元素不可修改

使用

所有包含迭代器的容器类型均包含对应迭代器方法

  • begin() 返回指向容器第一个元素的迭代器
  • end() 返回指向容器最后一个元素下一个位置的的迭代器 尾(后)迭代器

    根据容器类型确定返回迭代器的类型,若为常量容器,则返回常量迭代器
    如果容器为空 begin()与end()均返回尾迭代器

  • cbegin() 返回指向容器第一个元素的迭代器
  • cend() 返回指向容器最后一个元素下一个位置的的迭代器 尾迭代器

    返回指定类型的const_iterator的迭代器

迭代器运算符

运算符 结果
*itera 解引用 返回itera所指元素的引用
itera->mem 箭头运算符 可访问itera迭代器指向元素的mem成员,等价于(*itera).mem
++itera 使迭代器指向下一个元素位置
  • -itera|使迭代器指向上一个元素位置
    itera1==itera2|当且仅当两迭代器属于同一个容器且指向同一个元素或均指向尾元素下一位置时相等
    itera1!=itera2|当且仅当两迭代器属于同一个容器且指向同一个元素或均指向尾元素下一位置时相等

算数运算

运算 结果
itera + n 使迭代器向后移动n个位置
itera - n 使迭代器向前移动n个位置
itera += n 使迭代器向后移动n个位置,同时修改该迭代器
itera -= n 使迭代器向前移动n个位置,同时修改该迭代器
itera1 - itera2 返回两迭代器之间的差值,类型为difference_type,同属一个一个容器的迭代器才可
< <= >= > 关系运算

vector某些操作使迭代器失效

在涉及迭代器的循环中不允许改变迭代器所属的容器长度