【问题标题】:Random Access Iterators using Indexes - Example使用索引的随机访问迭代器 - 示例
【发布时间】:2013-10-05 21:37:07
【问题描述】:

我试图澄清我关于迭代器的概念,在阅读Random Access Iterators 时,本书指出这些迭代器可以与实例iterat[myIndex] 的索引一起使用。现在我以一种简单的方式使用了带有向量的随机访问迭代器:

std::vector<int>::iterator it;

for(it = vec.begin() ; it != vec.end() ; it++)
{
 std::cout << *it
}

我想知道如何将索引与随机访问迭代器一起使用,什么时候需要?任何建议将不胜感激

【问题讨论】:

  • 例如,如果您想实现自己的通用二进制搜索算法。您可以将参数设为iterators,并且您必须访问O(1) 中的元素。所以你需要一个随机访问迭代器。如何使用? it = vec.begin(); end = vec.end(); newpos = it + ((end - it) / 2);。在这种情况下,newpos 将介于 itend 之间。

标签: c++ iterator c++98


【解决方案1】:

假设您需要查看某个职位的前任和继任者(假设他们在那里)。你可以使用

it[-1] // predecessor
it[0]  // current position same as *it
it[1]  // successor

当然,如果存在,您也可以使用其他索引。尽管需要定义下标运算符,但我认为我在算法中不需要它。定位操作更为重要。

【讨论】:

  • it[n]*(it+n) 之间实际上有什么区别,还是前者只是语法糖?
  • +1 我也赞成这个问题,只是为了暴露大多数人甚至不知道的东西,rand-access 迭代器暴露了[]
  • @us2012 否,请参阅cppreference。每种迭代器类型的图表都很棒。
  • @us201233:这两个表达式在语义上是等价的。它们的实现是否相同是一个不同的问题。
  • @DietmarKühl 同意。可以在不创建临时迭代器的情况下执行前者。后者很难做到这一点。
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2021-07-03
  • 2019-12-06
  • 2011-05-17
  • 2017-09-02
相关资源
最近更新 更多