5

この小さなコードを書いたのは、イテレータが実際に無効になり、容量に達した後にベクトルの変更された場所を指していないことを確認するためだけです。

ここで vector と capacity のサイズは両方とも最初は 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 に答える