《C++ Primer》读书笔记第三章-3-迭代器介绍

来源:互联网 发布:工作台设计作图软件 编辑:程序博客网 时间:2024/06/05 13:08

笔记会持续更新,有错误的地方欢迎指正,谢谢!

前言:前面我们介绍了可以使用下标运算符来访问string对象的字符和vector对象的元素,这部分我们来介绍一种更通用的机制,迭代器。 为什么呢?因为所有的标准库容器都可以使用迭代器,但其中只有少数几种支持下标运算。另外,string虽不是容器,但支持迭代器。
迭代器作为for的判断条件时用==和!=,而不用<;下标作为for的判断条件时才用<。而string和容器都有迭代器,所以在写C++时,要习惯地使用==和!=。
总结:迭代器更普遍。

使用迭代器

例子:输出vector中所有的元素

vector<string> str = {"a", "b", "c"};for(auto it = str.begin(); it != str.end(); ++it){    cout << *it << endl;}

begin和end运算符

  1. begin()返回指向第一个元素的迭代器,注意是迭代器,不是元素本身;
  2. -end()叫尾后迭代器,返回容器最后一个元素的下一个位置,也就是说,该迭代器指示的是容器中一个本不存在的元素。如此,方便我们写循环;
  3. 在访问迭代器的时候,要加一个解引用迭代器*。
  4. 迭代器成员:begin和end运算符的具体类型由对象是否是常量决定,cbegin和cend始终得到const_iterator。
    iterator和const_iterator的作用:遍历容器内的元素,并访问这些元素的值。iterator可以改元素值,但const_iterator不可改。

迭代器运算符

  1. 解引用操作:*iter返回迭代器iter所指元素的引用。
  2. 结合解引用和成员访问操作:(*iter).men等价于iter->men;都是先对迭代器iter解引用得到对象,再去调用对象的men变量。
  3. \==和!=判断两个迭代器是否指向同一个元素或同时指向同一个容器的尾后迭代器。

移动迭代器

就是+1呗。。。

某些对vector对象的操作会使迭代器失效

在上一篇文章末尾,已经提到了使用vector的一个限制:不能在 范围for循环 中向vector对象添加元素。这里是使用vector的另外一个限制:有任何改变vector对象容量的操作,迭代器都会失效。

迭代器运算

算术运算

  1. 加减法就不用说了。
  2. <、<=、>、>=比较,参与比较的两个迭代器指向同一个容器的元素或尾元素的下一个位置,即可参与比较。

使用迭代器运算

实际应用—二分查找:
//text是有序的容器,我们要找target。

auto begin=text.cbegin();auto end=text.cend();auto mid=(begin+end)/2;//中间点for(;*mid!=targrt&&begin!=end;mid=(begin+end))//mid要和target比较,就必须加*{    if(target<*mid)//我们要找的元素是否在前半部分        end=mid;//忽略后半部分    else//我们要找的元素在后半部分        begin=mid+1;//忽略前半部分}
原创粉丝点击