基于范围的 for 循环是否缓存容器表达式,或每次迭代重新计算它
Does the range-based for loop cache the container expression, or re-evaluate it each iteration?
我有以下代码:
for (auto it = _locations.locations().begin(); it != _locations.locations().end(); ++it)
// Do something
我想用
for (const auto& location: _locations.locations())
// Do something
但后来意识到我不知道它将如何工作。每次迭代都会调用 locations()
方法,还是将容器表达式计算的结果"缓存"在本地,导致只有一个locations()
调用?标准是否以一种或另一种方式定义了这种行为?
是的,它需要"缓存"。
§[stmt.ranged]/1 说:
在每种情况下,基于范围的 for 语句等效于
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
因此,这要求begin-expr
和end-expr
分别只调用一次(当然,这受制于正常的"as-if"规则,因此,例如,如果它们没有可观察到的副作用,则可能会发生变化)。
相关文章:
- C++11 迭代向量的新方法?
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 对于C++随机访问迭代器(矢量迭代器),迭代器之间的差异是如何计算的?
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 从 for 循环的每次迭代创建一个新变量
- 自定义迭代器:如果 a 和 b 的行为不同,如何正确处理距离计算和相等比较
- 将多个计算放入使用基于迭代次数的变量的 for 循环中
- 特征:矩阵行的计算规范比在向量上迭代计算它们慢
- 插入新元素时结束迭代器会获得更新
- 有没有办法创建一个花哨的迭代器和相应的新数组,以便检查每个索引的索引值的条件?
- 是迭代器增量结果是新的迭代器
- 迭代器,用于使用 C++ 计算 CSV 中的列数
- 当我计算它并给我 O(n^3) 时,这个迭代函数是如何是 O(n/2) 的
- 向量迭代器在新对象的 push_back() 之后不兼容
- 迭代排序列表并计算不同的数字
- 新的迭代器需求
- 如何计算标准::矢量::<int>迭代器和标准::矢量<int>::reverse_iterator之间的距离?
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
- ranged-for 语句中的表达式是否在每次迭代时计算
- 基于范围的 for 循环是否缓存容器表达式,或每次迭代重新计算它