【问题标题】:A single iterator of vectorSvectorS 的单个迭代器
【发布时间】:2014-05-05 09:32:10
【问题描述】:

有没有一种有效的方法让单个 iterator 迭代 2 个对象 vector 的串联,就好像它们是一个对象一样?

这两个向量当然包含相同的数据类型。

更新:

我认为我应该提供更多关于我的问题和背景的细节。这可能会回答一些问题:

事实上,我有一个属性来存储该迭代器的最后一个位置,并且在一个方法中,我从上一次调用中停止的最后一个位置开始迭代,这可能在第一个向量中或在第二个向量中.

【问题讨论】:

  • 当您到达end 时,第一个将迭代器设置为begin?或者创建包含所有前两个向量的第三个向量。
  • 也许将两个向量都填充到您自己的“容器”对象中,并编写您自己的自定义迭代器来枚举它们,方法是在一个(或另一个)中保存一个迭代器以及指示 哪个一个。警告,如果你对迭代器标签进行完全随机访问,事情可能会变得……很忙。
  • Keil 解决方案的问题在于条件表达式。比较 来自不同容器 的两个迭代器可能“有效”,但它的 UB。来自 A 的迭代器不能合法地与来自 B 的迭代器进行比较,即使是 B.end()。它可能“有效”(可能适用于矢量),但不是因为标准支持它。
  • @WhozCraig 我不明白你为什么说是 UB,因为 vectorA 和 vectorB 都是 vector 并且迭代器应该兼容。我在发布之前测试了代码并且没问题,但是如果我忽略了什么请告诉我,我总是愿意学习:)
  • @KeillRandor 这不是类型的东西(显然它们是相同的type)。这是一个范围的事情。 C++11 24.2.1p6 和 C++11 24.2.1p7 指的是我所关注的内容,虽然在这里发布的时间太长,但它的关键是序列的迭代器仅与其他“可达”的值可比same 序列的迭代器。您的循环想法非常好;只是一点点按摩(something like this)。这似乎有点奇怪,但它完全符合标准。

标签: c++ vector stl iterator


【解决方案1】:

这个解决方案怎么样?它可能并不优雅,但我想它尊重标准。对吧?

vector<Whatever>::iterator it = vectorA.begin();
bool loopOnVectorA = true;

while(true) {

  // My stuff here

  if (loopOnVectorA && it == vectorA.end())
  {
    it = vectorB.begin();
    loopOnVectorA = false;
  }
  else if (it == vectorB.end())
  {
    break;
  }
  else
  {
    varPtrIt++;
  }
}

【讨论】:

  • 它不会编译 - While。如果您想要审查,制作一个工作(最好是可编译的)代码并去代码审查,他们擅长告诉工作代码的好与坏。
猜你喜欢
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2016-07-24
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多