std::vector 的基于 c++ 范围的迭代顺序
order of c++ range based iterations of std::vector
我在 std::vector
上使用基于范围的 c++ 迭代器,我想问 扫描顺序是否
保证是vector中元素的"natural"顺序?当我用下面的程序尝试它时,我看到它是,但我不确定它是否能保证始终表现相同?
#include <iostream>
#include <vector>
int main(int argc, char **argv)
{
std::vector<int> numbers{9,8,7,6,5};
for (auto number : numbers)
{
std::cout << number << " ";
}
std::cout << "\n";
return 0;
}
当我编译并 运行 它时,我得到了预期的顺序:
$ g++ -std=c++17 main.cpp -o main
$ ./main
9 8 7 6 5
是的,这是有保证的。基于范围的 for 循环总是使用迭代器的前缀运算符 ++
并从开始到结束。
技术如下:
基于范围的for循环
for ( for-range-declaration : for-range-initializer ) statement
在标准中定义为等效于此代码:
{
auto &&__range = for-range-initializer ;
auto __begin = begin-expr ;
auto __end = end-expr ;
for ( ; __begin != __end; ++__begin ) {
for-range-declaration = *__begin;
statement
}
}
其中 begin-expr
和 end-expr
取决于迭代的类型:
- 对于普通 C 数组
a[n]
,它是 a
和 a + n
。
- 对于定义成员
begin
和 end
(例如您的 std::vector
)的 class 对象 c
,它是 c.begin()
并且c.end()
.
- 否则对于对象
r
,它是 begin(r)
和 end(r)
的 ADL 查找。
基于范围的循环只是传统 for (auto it=numbers.begin(); it != numbers.end(); ++it)
循环的捷径。顺序总是从 begin
到 end
。
我在 std::vector
上使用基于范围的 c++ 迭代器,我想问 扫描顺序是否
保证是vector中元素的"natural"顺序?当我用下面的程序尝试它时,我看到它是,但我不确定它是否能保证始终表现相同?
#include <iostream>
#include <vector>
int main(int argc, char **argv)
{
std::vector<int> numbers{9,8,7,6,5};
for (auto number : numbers)
{
std::cout << number << " ";
}
std::cout << "\n";
return 0;
}
当我编译并 运行 它时,我得到了预期的顺序:
$ g++ -std=c++17 main.cpp -o main
$ ./main
9 8 7 6 5
是的,这是有保证的。基于范围的 for 循环总是使用迭代器的前缀运算符 ++
并从开始到结束。
技术如下:
基于范围的for循环
for ( for-range-declaration : for-range-initializer ) statement
在标准中定义为等效于此代码:
{
auto &&__range = for-range-initializer ;
auto __begin = begin-expr ;
auto __end = end-expr ;
for ( ; __begin != __end; ++__begin ) {
for-range-declaration = *__begin;
statement
}
}
其中 begin-expr
和 end-expr
取决于迭代的类型:
- 对于普通 C 数组
a[n]
,它是a
和a + n
。 - 对于定义成员
begin
和end
(例如您的std::vector
)的 class 对象c
,它是c.begin()
并且c.end()
. - 否则对于对象
r
,它是begin(r)
和end(r)
的 ADL 查找。
基于范围的循环只是传统 for (auto it=numbers.begin(); it != numbers.end(); ++it)
循环的捷径。顺序总是从 begin
到 end
。