C++ 嵌套迭代器
Posted
技术标签:
【中文标题】C++ 嵌套迭代器【英文标题】:C++ nested iterators 【发布时间】:2013-02-17 18:37:26 【问题描述】:可以像下面这样嵌套迭代器吗?
for (vector<type>::iterator i = list.begin(); i != list.end(); ++i)
for (vector<type>::iterator j = i; j != list.end(); ++j)
...
请注意,j
以 i
开头,而不是 list.begin()
。由于迭代器是随机访问的,我能保证i
和j
的顺序相同吗?有更好的方法吗?
【问题讨论】:
你没有嵌套迭代器(这本身没有意义)。您正在嵌套循环并复制迭代器。这里没有什么奇怪的。 【参考方案1】:你的代码是正确的。
两个迭代器将具有相同的顺序并且递增 j
不会影响 i
,只要您不进行任何与 invalidates iterators 相同的操作(例如从向量中擦除或推送到向量)。
【讨论】:
实际上并没有任何 C++ 的“文档”,但请参阅 ***.com/questions/6438086/iterator-invalidation-rules。 @LightnessRacesinOrbit 感谢您的链接!你说得对,我写那句话简化了太多。【参考方案2】:这绝对没问题,只要您在内部不做任何可能使迭代器无效的循环。
(顺便说一句,在我看来,list
对 std::vector
来说是个有问题的名字。)
【讨论】:
+1 表示选择标准容器的名称作为变量的名称。我最近经常看到这种情况(array
、list
、map
等)。
实名当然不是列表,只是缩短了,以便在本论坛阅读。【参考方案3】:
这很好。随机访问并不意味着随机顺序。这意味着您可以通过在迭代器上使用加法运算符(+
和 -
)来跳过容器。例如,使用随机访问迭代器it
,您可以执行it + 10
。对于非随机访问迭代器,您必须执行 it++
10 次才能达到相同的效果。 (std::advance
函数会为您封装)
【讨论】:
【参考方案4】:这应该可以正常工作。 Vector按顺序存储元素,两个迭代器都会遵循这个顺序。
【讨论】:
以上是关于C++ 嵌套迭代器的主要内容,如果未能解决你的问题,请参考以下文章