5

我写这个小代码只是为了看看迭代器实际上是如何失效的,并且在达到其容量后不指向向量的更改位置。

这里向量和容量的大小最初都是 5 。之后,我在 vector 中插入了一些其他元素,并且没有重新初始化我的迭代器以指向myvector.begin(). 再次打印矢量元素后,这会导致49我的输出中出现垃圾值。maximum size of vector is : 1073741823

myvector.begin()我的问题是为什么 C++在所有元素都复制到新位置后不会再次使点迭代器有效?
这也可能导致一些难以调试的行为。我知道一种安全的工作方式是始终在使用迭代器之前重新初始化它。

  #include<iostream>
  #include<vector>
  #include<stdio.h>

  using namespace std;

  int main()
  {
    vector<int> myvector;
    vector<int>::iterator it;
    int myarray[]= {100,200,300,400};
    myvector.insert(it,500);
    it=myvector.begin();
    myvector.insert(it,myarray,myarray+4);
    it=myvector.begin();
    for(;it!=myvector.end();++it)
    cout <<*it<<endl;
    cout <<"size of vector is :" << myvector.size() <<"\n"; 
    cout <<"capacity of vector is : " << myvector.capacity()<<"\n";  
    cout <<"maximum size of vector is : " << myvector.max_size()<<"\n"; 
    myvector.push_back(600);
    for(;it!=myvector.end();++it)
    cout <<*it<<endl;
  }
  Output of program :-
  100
  200
  300
  400
  500
  size of vector is :5
  capacity of vector is : 5
  maximum size of vector is : 1073741823
  49
  100
  200
  300
  400
  500
  600
4

4 回答 4

9

因为这是不切实际的,而且可能是不可能的。

向量是否应该保留所有迭代器的列表,并且一旦调用无效触发方法,它们就会修改所有迭代器?

于 2012-04-30T17:32:55.447 回答
4

迭代器没有以任何有意义的方式与向量绑定(如果是,它如何实现为指针?)。向量不知道迭代器。不使用无效的迭代器是你的工作。

因此,您建议为向量类添加大量复杂性……究竟是什么目的?在我们知道做这样的事情是个坏主意的现实世界中,这如何解决问题?

于 2012-04-30T17:34:37.507 回答
3

大概是因为向量必须跟踪所有迭代器的列表,并在它们变得无效时通知它们。这将引入相当多的开销。STL 容器的操作都有非常明确的失效规则,你只需作为程序员遵循它们。

请注意,根据标准,您不能依赖向量迭代器在插入或删除后完全有效。在调整大小之前它仍然对您有用,这是一个实现细节。

于 2012-04-30T17:34:26.020 回答
1

STL 没有尝试实现所有可能的容器。虽然您的容器设计当然是可能的,但它只是不包括在内。std::vector<T>看起来很相似,但它试图成为一个比T[]几乎没有开销的更好的数组。该目标与您的目标不直接兼容。

幸运的是,STL 设计是模块化的,因此即使您确实编写了自己的容器来执行此操作,您仍然可以重用所有 STL 算法以及与 STL 兼容的算法(例如那些在 boost 中的算法)。

于 2012-04-30T20:29:52.160 回答