【问题标题】:Understanding iterator's behavior for std::vector了解迭代器对 std::vector 的行为
【发布时间】:2015-06-14 16:06:58
【问题描述】:

我写了以下简单的例子:

#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;
    }
}

DEMO

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

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

得到输出

1
2
4
7
10

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

2
10
1
4
7

这对于某些实现是可能的吗?

【问题讨论】:

  • 它可靠吗?:只要 STL 容器的内容不改变,每次迭代它都会得到相同的输出。这是有保证的行为。
  • 不,我不这么认为——因为这些向量将在内部被实现为数组或 LinkedList——主要是数组(可调整大小),并且尝试做一些每次都会改变的事情对于实现来说很难.除非你愿意! :) 在那种情况下,你自己写! :)
  • 输出真的不一样吗?我在CodeChef IDE 上运行了你的代码,结果是一样的。
  • @gabhijit 它们必须实现为连续存储

标签: c++ vector iterator


【解决方案1】:

是的,它很可靠。

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

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

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

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

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

【讨论】:

  • 我想知道这是否也可以用语言律师安全的方式来回答;)插入函数的规范不是很正式,并且似乎与访问器函数无关。跨度>
  • @dyp:是的,我决定不走那条路,我希望能侥幸成功;p
  • 无序关联容器有可靠的迭代顺序吗?
  • @NirFriedman:哦,呃,我没想到这些。尽管如此,我认为他们必须这样做,只要通过散列层的一种“间接”。 (老实说,我不知道。)
  • @Nir:什么,“老实说,我不知道”这句话没有线索? ;)
【解决方案2】:

std::vector 保证像数组一样连续分配内存。所以使用迭代器访问向量总是保证std::vector的元素顺序相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2018-04-27
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多