STLコンテナ削除要素、イテレータが無効です

  1.タイプ:
  • 標準のSTLシーケンスコンテナ:ベクトル、文字列、両端キュー、リスト。
  • 標準のSTL連想コンテナ:セット、マルチセット、マップ、マルチマップ。
  • 非標準のシーケンスコンテナのリストとロープ。Slistは単一リンクリストであり、ropeは本質的に重い文字列です
  • 非標準の連想コンテナhash_set、hash_multiset、hash_map、hash_multimap。
  • 配列、ビットセット、valarray、スタック、キュー、priority_queueなどのいくつかの標準的な非STLコンテナ

      ポインターは配列イテレーターとして使用できるため、配列はSTLアルゴリズムで機能することに注意してください。

  2.要素を削除します
何かを削除したい場合は、削除アルゴリズムの後に消去を追加することを忘れないでください
いわゆる削除アルゴリズムは、最終的にはメンバー関数を呼び出して要素を削除する必要がありますが、removeは現在動作しているコンテナーを認識しないため、removeアルゴリズムは実際には要素を削除できません。
1.ベクトル
 
vector<int> v;   
v.reserve(10);   
for (int i = 1; i <= 10; ++i) {
 v.push_back(i);
}
cout << v.size();   // 10
v[3] = v[5] = v[9] = 99; 
remove(v.begin(), v.end(), 99); 
//v.erase(remove(v.begin(),v.end(),99),v.end());
cout << v.size();   // 10!

2.リスト
list <int> listTest;
listTest.remove(99); //このメンバー関数は実際に要素を削除し、erase + removeよりも効率的です
removeとremove_ifの違いは非常に似ています。しかし、ユニークは削除のように動作します。これは、間隔要素を保持しているコンテナーにアクセスせずに、間隔から物(隣接する重複値)を削除するために使用されます。コンテナから要素を本当に削除したい場合は、uniqueを呼び出してペアで消去する必要があります。Uniqueもリストのremoveと同様です。list :: removeと同じように、実際に物を削除します(そして、erase-removeイディオムよりもはるかに効率的です)。list :: uniqueは、隣接する重複値も実際に削除します(erase-uniqueよりも効率的です)。
 
3つのイテレータの失敗:
 
ネチズンからの質問:
void   main() 
{ 
vector <string> vcs; 
vcs.push_back( "this   is   A "); 
vector <string   > ::iterator   it=vcs.begin(); 
int   i=9; 
for(;it!=vcs.end();++it) 
{ 
cout < < "caplity   of   vector   is   :   " < <vcs.size() < <endl; 

cout < < "---> " < <*it < <endl;   //去掉此句会有一个超过vector 
                                   //大小的循环,高手能解释一下为什么? 
if(i==9) 
{ 
vcs.push_back( "this   is   BBBBB "); 
cout < < "vcs.push! " < <endl; 
} 
i=8; 
} 
}
典型的迭代器失效.

 
ベクトル:
1。要素が挿入されると(push_back)、終了操作によって返されるイテレータは無効である必要があります。
2.要素が挿入されると(push_back)、要素が挿入されない前から容量の戻り値が変更され、コンテナ全体をリロードする必要があります。このとき、最初と最後の操作によって返されるイテレータは次のようになります。無効。
3.削除操作(erase、pop_back)が実行されると、削除ポイントを指すすべてのイテレーターが無効になり、削除ポイントの背後にある要素を指すイテレーターも無効になります。
dequeイテレータの障害条件:
1。dequeコンテナの先頭または末尾に要素を挿入しても、イテレータが無効になることはありません。
2.先頭または末尾の要素を削除すると、削除された要素を指すイテレータのみが無効になります。
3. dequeコンテナの他の位置に挿入および削除すると、コンテナ要素を指すすべてのイテレータが無効になります。
リスト/セット/マップ
1.削除すると、削除されたノードを指すイテレータが無効になります
list<int> intList; 
list<int>::iterator it = intList.begin(); 
while(it != intList.end()) 
{ 
it = intList.erase(it); 
…… 
}


4.時間の選択<転送>-さまざまなコンテナの特性を要約します
(1)ベクトル
内部データ構造:配列。
各要素へのランダムアクセス。必要な時間は一定です。
最後に要素を追加または削除するのに必要な時間は要素の数とは関係がなく、途中または最初に要素を追加または削除するのに必要な時間は要素の数に比例して変化します。
要素は動的に増減でき、メモリ管理は自動的に行われますが、プログラマーはreserve()メンバー関数を使用してメモリを管理できます。
ベクトルのイテレータは、メモリが再割り当てされると失敗します(ベクトルが指す要素は、操作の前後で同じではなくなります)。容量()-size()を超える要素がベクトルに挿入されると、メモリが再割り当てされ、すべてのイテレータが無効になります。それ以外の場合、現在の要素の後の任意の要素を指すイテレータは無効になります。要素が削除されると、削除された要素の後の任意の要素へのイテレータは無効になります。

(2)Deque
内部データ構造:配列。
各要素へのランダムアクセス。必要な時間は一定です。
最初と最後に要素を追加するのに必要な時間は要素の数とは関係がなく、途中で要素を追加または削除するのに必要な時間は要素の数に比例して変化します。
要素は動的に増減でき、メモリ管理は自動的に完了し、メモリ管理用のメンバー関数は提供されません。
要素を追加すると、両端キューのイテレータが無効になります。dequeの途中で要素を削除すると、イテレータが無効になります。dequeの先頭または末尾で要素が削除されると、その要素へのイテレータのみが無効になります。

(3)リスト
内部データ構造:双方向循環リンクリスト。
1つの要素にランダムにアクセスすることはできません。
両方向に移動できます。
最初、最後、およびその間の任意の場所で要素を追加または削除するために必要な時間は一定です。
要素は動的に増減でき、メモリ管理は自動的に完了します。
要素を追加しても、イテレータは無効になりません。要素を削除するとき、現在削除されている要素を指すイテレータを除いて、他のイテレータは無効になりません。

(4)slistの
内部データ構造:単一 リンクリスト。
両方向に移動することはできず、前から後ろにのみ移動できます。
その他の機能はリストに似ています。

(5)
スタックアダプタ。通常、サポートされているシーケンスコンテナとしてdequeを使用して、任意のタイプのシーケンスコンテナをスタックに変換できます。
要素は後入先出法(LIFO)でのみ可能です。
スタック全体をトラバースすることはできません。

(6)
任意のタイプのシーケンスコンテナをキューに変換できるキュー アダプタは、通常、サポートされているシーケンスコンテナとしてdequeを使用します。
要素は先入れ先出し(FIFO)でのみ可能です。
キュー全体をトラバースすることはできません。

(7)Priority_queue
アダプター。通常、基になるストレージメソッドとしてベクトルを使用して、任意のタイプのシーケンスコンテナーを優先キューに変換できます。
priority_queue全体ではなく、最初の要素にのみアクセスできます。
最初の要素は常に最も優先度の高い要素です。

(8)設定された
キーと値が等しい。
キーはユニークです。
デフォルトでは、要素は昇順で並べ替えられます。
イテレータが指す要素が削除されると、イテレータは無効になります。要素を追加または削除するその他の操作によって、イテレータが無効になることはありません。

(9)マルチセット
キーは一意でない場合があります。
その他の機能はセットと同じです。

(10)Hash_setはsetと
比較されます。その中の要素は必ずしもソートされる必要はありませんが、使用されるハッシュ関数に従って分散されるため、検索速度が速くなります(もちろん、ハッシュ関数に関連します)。
その他の機能はセットと同じです。

(11)hash_multiset
キーは一意でない可能性があります。
その他の機能はhash_setと同じです。

(12)マップ
キーは一意です。
デフォルトのキーでは、要素は昇順で並べ替えられます。
イテレータが指す要素が削除されると、イテレータは無効になります。要素を追加または削除するその他の操作によって、イテレータが無効になることはありません。

(13)マルチマップ
キーは一意でない場合があります。
その他の機能はマップと同じです。

(14)Hash_mapは
map比較されます。その中の要素は必ずしもキー値でソートされる必要はありませんが、使用されるハッシュ関数に従って分散されるため、検索速度が速くなります(もちろんハッシュ関数にも関連します)。
その他の機能はマップと同じです。

(15)hash_multimap
キーは一意でない可能性があります。
その他の機能はhash_mapと同じです。

おすすめ

転載: blog.csdn.net/panpanloveruth/article/details/7018549