【问题标题】:Can I do pointer arithmetic on an STL::vector::iterator我可以在 STL::vector::iterator 上做指针运算吗
【发布时间】:2010-02-28 02:10:09
【问题描述】:

目前我使用迭代器来搜索向量并测试其元素。我使用

访问元素
std::vector<int>::iterator it;
if (*it == 0);

我可以使用相同的指针算术风格逻辑来测试下一个元素(不改变我的迭代器)吗?

我首先需要看看它是否会将迭代器推出边界

if (it != myvec.end())

然后测试当前元素和下一个元素

if (*it == 1 && *(it + 1) == 1)

这会像我期望的那样使用指针吗?

【问题讨论】:

    标签: c++ stl vector


    【解决方案1】:

    是的,std::vector 的迭代器是 random access iterators,因此您可以添加/减去整数值以获得其他有效的迭代器。

    从技术上讲,它可能不是指针算术,但它们的作用就像指针一样。

    【讨论】:

    • 那么,我不能对list::iterator进行算术运算,对吧?
    • @Alcott - 正确。 list::iterator 是双向迭代器,不支持随机访问。您可以使用std::advance 进行一次调用,但前进的复杂性是O(n) 用于列表(其中O(1) 用于向量)。
    【解决方案2】:

    这确实可以工作,因为向量迭代器是随机访问迭代器。这不仅可以像处理指针一样对它们进行操作,而且它们几乎可以使用指针/指针算法来实现。

    【讨论】:

      【解决方案3】:

      好吧,如果迭代器在容器的最后一个元素上,那么

      *(it + 1) 
      

      具有未定义的行为。 你应该检查一下

      it + 1 != end
      

      在取消引用之前。

      【讨论】:

      • 所以有点像使用指针,你必须检查自己它没有超出范围。
      猜你喜欢
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2011-10-14
      • 2015-12-15
      相关资源
      最近更新 更多