在 c++ 中,基于范围的 for 循环将保留索引顺序
Will range based for loop in c++ preserve the index order
在 c++11 中,如果我使用基于 for 循环的范围,它会保证迭代顺序吗?
即以下代码块是否保证产生相同的输出?
vector<T> output;
vector<U> V;
for( auto v: V) output.push_back(f(v));
与
for(int i =0; i < V.size(); ++i) output.push_back(f(V[i]));
如果不是vector
而是map
等等怎么办?
是的,保证这两个代码做同样的事情。虽然我没有标准的链接,但你可以看看这里。我引用:You can read that as "for all x in v" going through starting with v.begin() and iterating to v.end().
是的,它们是等效的。 6.5.4 中的标准保证:
对于表单的基于范围的 for 语句
for ( for-range-declaration : expression ) statement
设
range-init
等效于用括号括起来的表达式(表达式(以及基于范围的 for 表单语句
for ( for-range-declaration : braced-init-list ) statement
让
range-init
等效于大括号初始化列表。在每种情况下,基于范围的 for 语句等效于
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
其中
确定如下:__range
、__begin
和__end
是仅为表达式定义的变量,_RangeT
是表达式的类型,begin-expr
和end-expr
— 如果
_RangeT
是数组类型,则begin-expr
和end-expr
分别是__range
和__range + __bound
,其中__bound
是数组绑定。如果_RangeT
是未知大小的数组或不完整类型的数组,则程序格式不正确;— 如果
_RangeT
是类类型,则在类_RangeT
的范围内查找非限定 IDbegin
和end
好像通过类成员访问查找 (3.4.5(,如果其中一个(或两个(找到至少一个声明,则分别__range.begin()
和end-expr
begin-expr
和__range.end()
;— 否则,
begin-expr
和end-expr
分别是begin(__range)
和end(__range)
,其中begin
和end
使用依赖于参数的查找进行查找 (3.4.2(。出于此名称查找的目的,命名空间std
是关联的命名空间。
虽然你关于地图的问题有点荒谬。 如果它是一个有序映射,并且您正确地遍历了映射,那么它们是等效的。 如果它是一个无序地图,那么你的问题就没有多大意义了。
是和否(这取决于使用的容器(:
- 基于 for 的范围是一个循环,例如 for(迭代器 pos = range.begin((; pos !=range.end((;++pos( {/* 带有范围变量 = *pos */... }
- 运算符 [] 可能会执行不同操作(例如,如果键不存在,则 std::map 运算符对键进行查找并创建一个新条目(
例:
#include <iostream>
#include <map>
int main()
{
typedef std::map<int, int> map;
map m = { { 0, 0 }, { 2, 2 }, { 4, 4 } };
for(const auto& e : m) {
std::cout << e.first << " ";
}
std::cout << std::endl;
for(map::size_type i = 0; i < m.size(); ++i) {
std::cout << m[i] << " ";
}
std::cout << std::endl;
return 0;
}
结果是:
0 2 4
0 0 2 0 4
(第二个结果可能是在自己的脚上射得好,甚至是有意的(
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- C++ Python 循环"for i, num in enumerate(list):"版本
- C 多循环 for () 基础知识
- 没有条件值的 FOR 循环"for (int i = 1; ; i++)"无法正常工作
- 为用户提供循环for循环的选项
- 打破循环for循环