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) 
        ...
    

请注意,ji 开头,而不是 list.begin()。由于迭代器是随机访问的,我能保证ij 的顺序相同吗?有更好的方法吗?

【问题讨论】:

你没有嵌套迭代器(这本身没有意义)。您正在嵌套循环并复制迭代器。这里没有什么奇怪的。 【参考方案1】:

你的代码是正确的。

两个迭代器将具有相同的顺序并且递增 j 不会影响 i,只要您不进行任何与 invalidates iterators 相同的操作(例如从向量中擦除或推送到向量)。

【讨论】:

实际上并没有任何 C++ 的“文档”,但请参阅 ***.com/questions/6438086/iterator-invalidation-rules。 @LightnessRacesinOrbit 感谢您的链接!你说得对,我写那句话简化了太多。【参考方案2】:

这绝对没问题,只要您在内部不做任何可能使迭代器无效的循环。

(顺便说一句,在我看来,liststd::vector 来说是个有问题的名字。)

【讨论】:

+1 表示选择标准容器的名称作为变量的名称。我最近经常看到这种情况(arraylistmap 等)。 实名当然不是列表,只是缩短了,以便在本论坛阅读。【参考方案3】:

这很好。随机访问并不意味着随机顺序。这意味着您可以通过在迭代器上使用加法运算符(+-)来跳过容器。例如,使用随机访问迭代器it,您可以执行it + 10。对于非随机访问迭代器,您必须执行 it++ 10 次才能达到相同的效果。 (std::advance 函数会为您封装)

【讨论】:

【参考方案4】:

这应该可以正常工作。 Vector按顺序存储元素,两个迭代器都会遵循这个顺序。

【讨论】:

以上是关于C++ 嵌套迭代器的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套迭代器迭代两级结构

C++迭代器 iterator

C++迭代器 iterator

深入理解C++迭代器:让你的C++代码更加灵活

c++ 迭代器问题

c++ 迭代器库