ベクトルクラスRAII
テンプレート<型名T、型名A>
ベクトルボイド<T、A> ::リザーブ(NEWALLOCをint型)
{
(NEWALLOC <=スペース)リターンIF; //は、割り当てられたメモリの減少はありません
T * P = alloc.allocate(NEWALLOCを) ; // 新しい領域を割り当てる
(のためにint型i = 0; iは<SZ ; ++ I)alloc.construct(&P [i]は、[I])ELEM; // コピー
するためには、(INT i = 0; I <SZ; ++ I)alloc.destroy( &ELEM [I]); //破壊
alloc.deallocate(ELEM、空間); //古い空間放出
ELEM = Pと、
空間= NEWALLOC;
}
単純なテキストエディタ
最も重要なのは、リストの性質が挿入または要素を移動することなく削除することができます。
私たちは、「行」コンポーネントのシリーズとしてファイルをテキスト、およびラインはベクトル<文字>はリスト<ライン>で表されます。
既存のリンクを移動せずに、リストに新しいリストを追加することができ、論理上の理由から、非常に重要であり、我々は可能ということで
、今、これらの既存のリンク、またはポインタへのイテレータ(および参照)を使用して、これらのリンクを指し示しますオブジェクト。
加工ライン
どのように我々は、文書は「行」を意味しているかを判断する必要がありますか?:明らかに、3つの選択肢がある
1、改行文字により(例えば「N」)が決定されます。
2、「自然」、句読点のいくつかの種類で文書を解析するためのいくつかの方法を使用して(例えば)。
二列に全ての行の指定された長さ(例えば、50文字)を超える3、。
ライン=ベクトル<文字>を使用して; //行は文字ベクトルであります
ドキュメント構造体
{
lsit <ライン>線と、文書の//行が一覧である
文書(){line.push_back(行{});}
};
ドキュメントを読むと、以下のように枝を行うことができます。
&演算子>>のIStream(のIStream&IS、ドキュメント&D)
{
用(CHチャー; is.get(CH);)
{
d.line.back()一back(CH);. //文字を追加
する場合(CH ==「\ N- ')
d.line.push_back(ライン{}); //行を追加
}
IF(d.line.back()サイズ())d.line.push_back(ライン{});. //最後に空を追加OK
;リターンである
}
のベクトルリストとバック()メンバ関数は、基準要素の末尾へのポインタを返しています。
トラバーサル
私たちは、ドキュメントのイテレータのための特別なクラスを定義します。
クラスText_iterator //トレース行と行の文字位置
{
一覧<ライン> ::イテレータで、
ライン::イテレータPOS。
公共:
//イテレータ文字行は、位置PP ||で開始
Text_iterator(一覧<行> :: ||イテレータ、イテレータ::ラインPP)
:で{}、{}} PP {POS LL
チャー&演算子&*(){reurnの*のPOS;}
Text_iterator&演算子++();
ブール演算子==(CONST Text_iterator&その他)のconst
{== other.In && POSにおいてリターン== other.pos;}
ブール演算子=(CONST Text_iterator&その他)CONST!
{reurn(*この==他);!}
} ;
ベクトル、リスト、文字列
、文字列記憶の4つの方法
のchar [](文字列)を、
ベクトル<チャー>、
ストリング、
リスト<チャー>
elemは[]:独自のサイズを知りません。
ベクトル[ELEM]:
文字列:メモリに記憶されている連続的な要素を確実。文字列は、拡張することができます。
リスト[ELEM]:
あなたがプログラムの中で大多数のオブジェクトを使用する必要があり、かつ(イテレータまたはポインタで)多くの場所でそれらを指すようになります場合は、リストを使用して検討すべきです。
違いは、ベクトルのリストは、我々はすべての要素を移動しなかったことで、qは常に効果的です。
リストPCに<チャー>と他の3つの容器の少なくとも3倍比べ----ストレージ、リスト<チャー>
各要素を格納するための12バイト、ベクトル<チャー>のみ1を取りバイト。
実際には、ベクトルのデザインのアイデアの一つは、(一backすることである)、このような最適化する「メモリ操作」、
および文字列ではありません。
ベクトルと文字列のロジックの主な違いは、ベクトル要素のほぼすべてのタイプのために使用することができることを、私たちは文字を扱うときにだけある
文字列のみを考えます。.. 要するに、文字列の使用を検討する前に、文字列操作の必要性は、他の例では、良いベクトルの場合のみ。
関数のSTLベクトルクラスバージョンを達成するための調整
STLのバージョンの機能を実現するために、組み込みの配列を調整します
概要では、タンク
STLコンテナの数を提供します:
要素ベクターの配列は、連続的に保存され、デフォルトのコンテナアプリケーションではない
二重リンクリストをリスト;あなたは、既存の要素を移動することなく行う要素の挿入や削除に使用したい場合
、クロスベクトルと両端キューのリストを、しない限り、あなたはそれを使用しないでください、コンピュータアーキテクチャの算術演算や知識に非常に熟達している
あなたは値によって要素にアクセスする必要がある場合、それを使用し、バランスのとれた秩序ツリーをマッピングします。
マルチマップ平衡順序木は、同じキーの複数のコピーを含むことができ、あなたがアクセス要素の値としてそれを使用する必要がある場合。
unordered_mapハッシュテーブルは、最適化されたマップは、高パフォーマンスの要件については、大規模なマップとしてそれを使用し、優れたハッシュ関数を設計することができたときに
unordered_multimap
バランスSETと秩序の木、あなたは単一の値を追跡する必要がある場合、それを使用
マルチセットは順序木の同じキーバランスの複数のコピーを含む可能性があります。あなたは、単一の値である追跡するためにそれを使用する必要がある場合は
、固定サイズの配列の配列、配列は存在しない存在する問題のほとんどを建て
コンテナとは何ですか?
STLコンテナは:
要素のシーケンスである[開始():終了() ]。
コピー操作は、要素のコピーを提供します。コピー代入演算子やコピーコンストラクタによって実現することができます。
VALUE_TYPEという名前の要素型。
イテレータクラス
入力イテレータ:我々は*読ん要素値で、++で前方に移動することができます。そのようにはistreamイテレータを提供します。
出力イテレータ:我々は*書き込み素子値で、++で前方に移動することができます。そのようにostreamにイテレータを提供します。
フォワードのイテレータ:私たちは繰り返し*読み取りと書き込みの要素と、++で前方に移動することができます。
双方向イテレータ:++我々が前進するために、繰り返し使用することができます- *読み取りと書き込みの要素と、後方に移動します。
ランダムアクセスイテレータ:++我々が前進するために、繰り返し使用することができます-後方に移動し、使用*または[]の要素を読み書きします。
私たちは、インデックスのランダムアクセスイテレータの操作を実行すると、イテレータに+プラスの整数を使用することができます-イテレータの整数マイナス。
我々は2つのイテレータ減算から同じ列を指すようにすることによって、それらを得ることができます。そのようなベクターイテレータを提供します。