【问题标题】:C++ idiomatic way of iterating over a container that itself is being modified迭代本身正在修改的容器的 C++ 惯用方式
【发布时间】:2021-01-30 05:36:57
【问题描述】:

我发现自己在循环内部正在修改的容器 X 上进行迭代。但在每次迭代中,都需要未修改的 X:

for (int x : X) { // wrong, container X in iteration should be the "original"
    modify_X();  // X modified here
}

一个解决方案是迭代一个副本

containerT X_copy(X);
for (int x : X_copy) {
    modify_X();   
}

for (int x : containerT {X}) {
    modify_X();   
}

有没有一种惯用的方法?

【问题讨论】:

  • 我认为第二个选项是你能得到的惯用语。
  • 除非您的容器包含指针,否则这些都不会修改原始内容。
  • 在示例中需要更多的肉才能给出结论性的答案
  • 除非您明确使用指针,否则x 将是一个副本

标签: c++ iterator iteration


【解决方案1】:

您问题中的最后一个示例看起来最简单。但是,从 C++20 开始,您也可以这样做:

for (auto copy = X; int i : copy)
{
  modify_X();
}

这是demo

请注意,在您的第一个 sn-p 中,它不仅在逻辑上是错误的,而且还会调用未定义的行为,因为您正在修改您正在迭代的范围。

【讨论】:

  • 哦,太好了,我希望的那种语法!必须说这些语言更新确实改进了语法:-)
  • @zen 确实如此,但在这种情况下是偶然的。这个构造的目的是当你想像这样迭代时:for (int i : f().X),其中f() 返回一个带有X 成员的临时对象。但它当然可以适应其他情况:)
猜你喜欢
  • 2021-03-28
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2019-04-25
  • 2011-03-02
  • 2020-11-21
相关资源
最近更新 更多