【问题标题】:idiomatic way of changing container elements while iterating over the container在迭代容器时更改容器元素的惯用方式
【发布时间】:2021-03-28 16:18:57
【问题描述】:

以下操作字符串或容器的方式是惯用的吗?

string s = "hello";
for (auto &p : s) {
    p = somefunction(p); // somefunction without side effects
}

这意味着在更改包含的元素时迭代一个范围。容器的布局没有被修改,所以迭代器在迭代过程中应该是有效的。

同样的效果当然可以很容易地以不同的方式“编码”,但我感兴趣的是这是否是惯用的方式?

我之前问过一个类似的问题,但这与容器布局被修改的情况有关,这里的答案是:迭代容器的副本。 C++ idiomatic way of iterating over a container that itself is being modified

【问题讨论】:

  • 成语可以改变。这实际上取决于具体的用例。例如在这里我会简单地写s = std::string(5, 'a');
  • 是的,这是一个最小的例子,实际上'a'可以在循环期间变化。只是想让代码变得超级简单。也许我做得过火了……
  • 那种。问题是,“'a' 在循环中如何变化”将告知易于阅读的代码类型。就像我说的,这取决于代码实际上应该做什么。
  • 是的,将分配从= 'a' 更改为= somefunction(p)
  • 这可能是惯用的,除了布尔值向量(它实际上不是容器)

标签: c++ iterator containers


【解决方案1】:

习语会随着时间而改变,所以这里有一个 C++20 版本,在不久的将来很可能会成为习语。

std::ranges::transform(s, s.begin(), someFunction);

这是demo

【讨论】:

  • 绝对!谢谢!但是现在我们可以将 s.begin() 设为可选;-)
  • @youwouldbesurprised 实际上,我希望我们会很快。在 C++23 中,我们很可能能够做类似s |= std::action::transform(someFunction); 的事情,这将是真的很好:)
猜你喜欢
  • 2021-01-30
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2010-12-21
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多