了解 std::vector 的迭代器行为

St.*_*rio 1 c++ iterator vector

我写了以下简单的例子:

#include<iostream>
#include<vector>

int main()
{ 
    int arr[] = {1, 2, 4, 7, 10};
    std::vector<int> vect;
    vect.assign(arr, arr + 5);
    for(std::vector<int>::iterator it = vect.begin(); it != vect.end(); ++it)
    {
        std::cout << *it << std::endl;
    }

    std::cout << "-------------------------------------" << std::endl;

    for(std::vector<int>::iterator it = vect.begin(); it != vect.end(); ++it)
    {
        std::cout << *it << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

演示

并且两个循环打印相同。我的问题是它可靠吗?迭代向量是否每次都以相同的顺序返回元素?我的意思是,它是标准化的还是允许某些实现以不同的顺序迭代向量。例如,我们第一次迭代向量如下:

for(std::vector<int>::iterator it = vect.begin(); it != vect.end(); ++it)
{
    std::cout << *it << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

并获得输出

1
2
4
7
10
Run Code Online (Sandbox Code Playgroud)

同时,第二次迭代产生输出:

2
10
1
4
7
Run Code Online (Sandbox Code Playgroud)

这可能用于某些实现吗?

Lig*_*ica 5

是的,它是可靠的。

向量是一个“序列容器”,这意味着它的排序是确定性的。您选择容器中元素的顺序,这就是您在迭代时从中得到的顺序。总是。

  • 您使用位于索引 0到索引 N-1 的元素填充向量;
  • 向量的迭代器从索引 0迭代到索引 N-1。

从这个意义上说,这完全类似于在数组中向前走。

有趣的是,即使是关联容器也有可靠的迭代顺序;即使元素排序是由使用比较器(您可以指定,如果不指定,则为 )的算法执行的,std::less而不是简单地根据您附加元素的顺序。

您始终可以合理化标准容器的迭代顺序。

  • @Nir:什么,“老实说,我不知道”这句话不是线索?;) (2认同)