zoukankan      html  css  js  c++  java
  • 条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》

    条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》

    迭代器的种类一共有四种,上面已经说过了。这里就不再次写出来。

    这一个条目主要是reserce_iterator和iterator的转换。可以使用base()函数来把前者转换为后者。

    比如在拥有reserve_iterator,但需要用到插入,删除成员函数,那么这两个是不接受reserve_iterator作为参数的,所以需要转换为iterator再进行下一步的插入和删除元素。

    ![](file:///storage/emulated/0/Pictures/ddReader/1550051908649.png)
    以上代码得到的实际元素排布如下图:
    ![](file:///storage/emulated/0/Pictures/ddReader/1550050066331.png)

    首先应了解,通过base()得到的迭代器,只是把rbegin 和rend位置调换,然后整体向右移动一个地址。所以这样会造成调用base()迭代器指向的位置不一致,iterator会比reserve_iterator右移一位。

    插入操作
    这样在插入的时候,因为是在迭代器指向前插入新元素的,所以两种迭代器的结果是一样的。

    删除操作
    由于调用base()后的迭代器指向不一样,所以删除元素的结果是不一样的。

    解决方法:

    • 1.看起来“可行的”。
      ![](file:///storage/emulated/0/Pictures/ddReader/1550127908322.png)
      这种方法在vwctor和string的时候有些stl实现会编译出错。因为它们的底层实现是迭代器是一根指针。

    C和C++都规定了从函数返回的指针不应该被修改

    • 2.最优的方法。
      ![](file:///storage/emulated/0/Pictures/ddReader/1550128041131.png)
      这种方法是,既然base()后你迭代器的指向后移一位,那么我就先往前一位再调用base(),这样得到的迭代器就是reserve_iterator和iterator的指向是一致的。

    通过base()函数可以得到一个与reverse_iterator“相对应的”iterator的说法并不准确。对于插入操作,这种对应关系确实存在;但是对于删除操作,情况却并非如此简单。当你将一个reverse_iterator转换成iterator的时候,很重要的一点是,你必须很清楚你将要对该iterator执行什么样的操作,因为只有在此基础上,你才能够确定这个iterator是不是你所需要的iterator。

  • 相关阅读:
    《Spark大数据处理:技术、应用与性能优化》PDF电子书下载
    机器学习实战PDF中文版+英文版高清电子书+随书源码下载
    马云内部讲话系列(全3册)PDF电子书下载
    《OpenCV计算机视觉编程攻略(第3版)》高清中文版+英文版PDF+源码下载
    解决 VScode (因为在此系统上禁止运行脚本)报错
    浅谈Vue组件及组件的注册方法
    Win10 如何右键新建.md文件
    身份认证与加密浅谈(PKI)
    Git 代码托管有哪些选择,从 GitHub、GitLab 公共托管到自建服务
    单点登录的三种实现方式
  • 原文地址:https://www.cnblogs.com/liangjf/p/10634071.html
Copyright © 2011-2022 走看看