同时遍历两个 std::lists

Posted

技术标签:

【中文标题】同时遍历两个 std::lists【英文标题】:iterate through two std::lists simultaneously 【发布时间】:2013-11-12 15:44:07 【问题描述】:

抱歉,这个问题太简单了。

之前的错误检查确保l1.size() == l2.size()

std::list<object1>::iterator it1 = l1.begin();
std::list<object2>::iterator it2 = l2.begin();

while(it1 != l1.end() && it2 != l2.end())

  //run some code

  it1++;
  it2++;

这是一种合理的方法,还是有更优雅的解决方案?感谢您的帮助。

【问题讨论】:

次要点:递增迭代器的常用习语使用前缀而不是后缀++。 IE。 ++它1;而不是 it1++;这与性能相关的原因不明。 还有一个小问题:如果 l1.size() == l2.size() 你只需要在 while 条件下进行一次测试。 @DaleWilson:这并不是那么晦涩难懂。这只是后增量运算符所需的复杂(不是数学意义上的)类型所产生的复制构造开销。 @TomSwifty:这真的取决于你要增加什么。 operator++() 应该返回 T&amp;,而 operator++(int) 返回 T。但是,考虑到返回值优化、移动语义等等,我不确定它是否真的会给当今的编译器带来问题。 它用于给定对象类型的迭代器。原因是后增量会创建一个副本,对其进行增量,然后返回原始值。贵的是副本。 【参考方案1】:

如果无条件发生增量,我更喜欢使用for

for(; it1 != l1.end() && it2 != l2.end(); ++it1, ++it2)

    //run some code

您可以在列表大小相同的情况下省略一项测试,但我不确定运行一些代码中发生了什么!

【讨论】:

你也可以在 for 循环头中包含 init 吗? for(iterator it1 = l1.begin(), iterator it2 = l2.begin() ... ? 是的,有可能【参考方案2】:

我认为这是完全合理的(除了我会使用前置增量而不是后置增量)。

您可以考虑使用某种"zip iterator",但在这种情况下,这并不完全值得麻烦。

【讨论】:

【参考方案3】:

如果你对每一对对象做一个简单的操作,你可以使用std::transform

【讨论】:

【参考方案4】:

按照您的方式进行操作是合理的,您可以采取其他一些方法来最大限度地减少检查的数量:

如果您已经检查了两个长度是否相等(如先前检查所述),则标准 for 循环可能就足够了,它消除了对两个变量的访问,并且仅依赖于一个变量的增量:

for (int i = 0; i< l1.size();i++)

    // run some code here

但是,您需要使用advance()next() 在“此处的一些代码”中遍历列表中的对象。

【讨论】:

以上是关于同时遍历两个 std::lists的主要内容,如果未能解决你的问题,请参考以下文章

forEach 在javascript中同时循环遍历两个数组[重复]

FFmpeg Batch 同时遍历两个不同文件夹中的文件

第11条:用zip函数同时遍历两个迭代器

python 同时遍历俩个列表

如何在Jinja中同时遍历2个元素?

两个list同步遍历, 有对应关系,希望同时完成遍历 用迭代器迭代的方法也不是不可以,python提供了更直观的方法: 可以使用zip把两个list打包 ,