c++シーケンスコンテナ
1934 ワード
1.いくつかの順序容器の比較
ようき
本質
特長
適用範囲
vector
可変サイズ配列
連続ストレージ、高速ランダムアクセス、末尾挿入を除いた削除が遅い
デフォルトの使用
deque
デュアルエンドキュー
クイックランダムアクセス、最初と最後の挿入を除いて削除が遅い
両端に削除要素を追加する必要があります
list
にほうこうチェーンテーブル
ランダムアクセスはサポートされていません(遍歴のみ)、挿入削除が迅速で、追加メモリのオーバーヘッドが大きい
要素を挿入する必要があります
forward_list
たんほうこうチェーンテーブル
listと同様に、一方向シーケンスアクセスのみをサポート
同上
array
固定サイズ配列
組み込み配列と同様、より安全で使いやすい
固定サイズ配列
string
クラスvector、保存文字
れんぞく
きおくもじ
vector/dequeかlist/forward_を選択Listは、アクセス操作と挿入/削除操作の相対的な割合に依存します.
より頻繁にアクセスするにはvector/dequeを選択します.頻繁に挿入/削除する場合はlist/forward_を選択します.list.
テクニック:エレメントを中間位置に挿入し、その後ほとんどアクセス操作を行う必要がある場合は、入力フェーズでlistを使用して、入力完了をvectorにコピーできます.
2.vector、stringオブジェクトの格納
高速ランダムアクセスをサポートするためにvectorは要素を連続的に格納します.ストレージのたびにメモリ割り当てを申請すると、要素を削除するたびにメモリが解放され、プログラムの実行性能が大幅に低下します.したがってvectorおよびstringの実装では、通常、必要よりも大きなスペースが割り当てられ、コンテナはこれらのスペースをスタンバイとして予約し、新しい要素を追加するたびにメモリを再割り当てする必要がなくなります.
もちろん、メモリを再割り当てするたびにすべての要素を移動するという欠点もあります.しかし、このポリシーを使用すると、拡張操作は通常listおよびdequeよりも速くなります.
そのため,コンテナサイズ管理操作にはvectorとstringのみc.capacity()があり,他のコンテナと共通してc.size()である.
c.capacity()は、割り当てられた空間サイズ(すなわち、新しいメモリスペースを割り当てない前に最も保存できる要素サイズ)を意味する.
c.size()は、実際に保存されている要素の数を意味します.だからc.capacity()>=c.size()があります.
3.容器操作によって反復器が失効する可能性がある
コンテナに要素を追加または削除すると、コンテナ要素へのポインタ、参照、または反復器が無効になる可能性があります.
要素の追加または削除:
vectorとstringでは、位置を挿入または削除した後も要素のポインタ、参照、反復器が無効になり、以前も有効です.メモリを再割り当てする必要がある場合は、コンテナへのポインタ、参照、反復器はすべて無効になります.
queueの場合、先頭と末尾を除く任意の場所を挿入または削除すると、ポインタ、参照、反復器が無効になります.
2 listには影響しません.
失効による問題を回避するために、insertまたはeraseのような反復器を返す操作を使用して反復器を更新することができます.
ループ前にend()が返す反復器を保存するのではなく、挿入操作のたびにend()を再呼び出す必要があります.
エラーの例:
auto begin = v.begin()
end = v.end();
while (begin != end)
{
// ,
}
正しい例:
while (begin != v.end())// end
{
// ,
}