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-exprend-expr 取决于迭代的类型:

  • 对于普通 C 数组 a[n],它是 aa + n
  • 对于定义成员 beginend(例如您的 std::vector)的 class 对象 c,它是 c.begin() 并且c.end().
  • 否则对于对象 r,它是 begin(r)end(r) 的 ADL 查找。

基于范围的循环只是传统 for (auto it=numbers.begin(); it != numbers.end(); ++it) 循环的捷径。顺序总是从 beginend