第三章の研究ノートを「背景には、実際のコア技術とアプリケーションを開発します」
一般的なSTLの第III章
-
STLとは何ですか
STLは、標準テンプレートライブラリは、それが効率的なC ++ライブラリであることを確認してください。
-
ストリング
文字列クラスの下には、文字列へのポインタです。
一般的なコンストラクタ
String::String(const char *str){
if(str == NULL){
m_data = new char[1];
*m_data = '\0';
}
else{
int length = strlen(str);
m_data = new char[length+1]; //+1用来存放'\0'
strcpy(m_data,str);
}
}
文字列のデストラクタ
String::~String(){
if(m_data){
delete[] m_data;
m_data = 0;
}
}
コピーコンストラクタ
String::String(const String &other)[
if(!other.m_data){
m_data = 0;
}
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
]
ミューテーター
String & String::operator=(const String &other){
if(this != other){
delete[] m_data;
if(!other.m_data){
m_data = 0;
}
else{
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
}
return *this;
}
}
コンテンツ自体と一致し、受信パラメータの内容場合は、割り当てを必要としません。入ってくるパラメータ自体がコンテンツと一致しない場合は、コンテンツ自体を空にする必要があります。
文字列の連結
String & String::operator +(const String &other){
String newString;
if(!other.m_data){
newString = *this;
}
else if(!m_data){
newString = other;
}
else{
newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+1];
strcpy(newString.m_data,m_data);
strcat(newString.m_data,other.m_data);
}
return newString;
}
平等のために
bool String::operator == (const String &other){
if(strlen(m_data)!=strlen(other.m_data)){
return false;
}
else{
return strcmp(m_data,other.m_data)?false:true;
}
}
対応するC ++文字列C :.データ()、c_str()、(コピー)データ()文字配列の内容の文字列形式を返し、追加しません「\ 0」に変換し、c_str()が返しますバイトの配列の「\ 0」末端は、コピーに書き込まれたり、文字列または文字列の既存の内容をC_STRING()をコピーします。
そして、int型の変換は刺します
(1)int型のターン文字列:snprintfのを使用して()関数は、関数のプロトタイプであります
int snprintf(char *str,size_t size,const char *format,可变参数)
(2)スティングトランスINT:使用strtolは、はstrtoll、strtoulを、strtoull関数は、関数プロトタイプであります
long int strtol(const char *nptr,char **endptr,int base);
long long int strtoll(const char *nptr,char **endptr,int base);
unsigned long int strtoul(const char *nptr,char **endptr,ing base);
unsigned long long int strtoull(const char *nptr,char **endptr,int base);
文字列関数の他の一般的なメンバー
3. ベクトル
容器は、線形ベクター、及びダイナミックアレイのようなものです。連続要素は、より高速なストレージ領域に格納されます。容器の大きさ一般未満であるか、または容器の容量に等しく、ベクトル::サイズ()コンテナのサイズを返し、ベクトル::容量()容量の値を返します。
ベクトルトラバーサルいくつかの方法でこれを持っています
for(int i=0;i<a.size();++i);
for(iter=ivector.begin();iter!=ivector.end();iter++);
for_each;
構造体はベクターに格納されている場合、その定義分類に従って分類することができます。
構造は、in vitro比較関数で定義され、その後、ソート比較関数CMPを呼び出すことができます。
それはヘッダファイルの#includeに追加する必要がありますので、ベクトル検索は、検索機能ベクターは、ここでメンバーではないことに注意して、検索機能を使用することができます
ベクトル、削除、消去、またはpop_back機能を有していてもよい、あなたは消去することができますまたは削除要素は、要素指定された場所を指定し、pop_backは、最後のデータ配列を削除することができます。
そこに挿入することができ、一backは、挿入要素が位置に挿入され、ベクターの増加、一backは、最終的に要素を追加します。
要素が追加されると元のメモリが十分でない場合、そこに新たな動的メモリ割り当て1.5~2倍の現在のサイズであり、その後、過去の要素を割り当てます。一般的に、同様のに比べベクトルとアクセス速度の一般的な配列は、唯一のプロパティの再分配に落下しないであろう。一backするデータの必要量が多い場合は、予備を使用する必要があります()関数は、事前に容量の大きさを設定します。
余分な空間ベクトル/メモリーをトリミングする使用「スワップトリック」
vector<int>(ivec).swap(ivec)
ベクトル占有率は、それぞれの場合に例メモリ空間のサイズ:、ベクターは、コンテナの成長容量に応じて行われるが、今倍増され、前の元の連続したメモリ空間の簡単な重ね合わせではなく、新しい、より大きなメモリを再申請します過去の既存のコンテナ要素をコピーして1は、同時に古いメモリを破壊します。この時点で、イテレータ上の元のメモリ空間はとてもコンテナ、現在までの反復子を操作するとき、失敗しました。
4. マップ
特定のキーが関連付けられていると要素の値にエッセンス嘘をマップします。特長は、ほとんど効果イテレータノードを追加および削除されます。基本となる実装があるマップ赤黒木。すべての内部の地図データが発注されます。
インサートのマップ
機能アレイ状インサート機能インサートデータ対を挿入し、データVALUE_TYPEインサートとインサートデータ:3つの方法で地図を挿入します。
マップ内のキーワードが存在する場合、データを挿入することによって第一及び第二のインサート機能は、操作インサートデータは、キーワードに対応する配列の前の値は上書きされ、挿入することができません。
マップトラバーサル
逆の方法を使用して順方向イテレータ、イテレータとアレイを適用するマップを横断する3つの方法があります。
ベクターは、アレイにアクセスするために使用されるインデックスが0である、サイズ1、地図添字アレイアクセスを1つのサイズ。
のマップを探します
位置特定データを検索する機能が存在し、反復子位置データがない地図データがない場合見つけるために、配置されている戻りデータが存在する場合、反復子を返し、関数はイテレータを返すイテレータを両端に均等に戻ります。
マップを削除します。
消去法でマップ内の要素を削除します。注意を払うまでの時間ではイテレータの要素を削除し、無効です。
ソートマップ
デフォルトのマップをキーに従って昇順にソートされ、より少ない比較的大きいがある、オブジェクト、本質的に、演算子()演算子のオーバーロードの少ない機能です。
マップのキーは、<操作を上書きしない場合は、基礎となる赤黒木マップが実装されているので、正常にコンパイル時に挿入しないようにつながる、挿入<キー、値に>、キーがオーダーの大きさとなり、構造体であります比較動作の<理由にできるようにするキーの種類であり、記憶されています。
のみソート線形メモリ素子がソートされているので、下にある赤黒木に格納される非線形マップを直接ソートすることができないため、存在することができ、次いでソート呼び出し、ベクターに要素をマッピングすることができます<オーバーロード、値関数でソート実現。ソートも指定された要素と比較することができるように、マップは、比較、マップが定義で指定された指定されたので、上院は、あなたがたが呼ぶとき、あなたが渡す必要があり、ソートアルゴリズムが指定されている関数オブジェクトのクラス名に直接渡されるときオブジェクト。
原則マップ
内部マップは赤黒木、自動的にソートされたデータです。赤黒木は二分探索木です。着色された赤黒木その関連特性の相対的なバランスを増大させます。常に高度のLOGNを維持するために、赤黒木、次のプロパティを:
- ルートノードは黒
- NULLノードツリーの端部である各リーフノードは、黒色であります
- レッドは、パス上の2つの連続したノードを許可しました
- 各パスの葉ノードのツリーの後端がブラックノードの同じ数を含む任意のノードについて
赤黒木挿入および削除操作が特性を維持するために、特性が赤黒木、赤黒木を破壊することができる場合、色は赤黒木は、元の特性を維持するように、ノードの右利きと左利きの操作を反転させてもよいです。
5.set
STLでは、ベクターは、パッケージリストは、マップやバイナリパッケージを設定し、配列、リストをカプセル化します。
何がそれを設定しましたか?
セット内の各要素の値は、ユニークな要素の値に応じて自動的にソートします。STLセット、マルチセット、マップ、マルチマップ底部が赤黒木です。
コンテナよりも挿入、削除、効率マップセットの高なぜ他の配列?
セットとメモリコピーとメモリが移動しないマップ。セットコンテナのすべての要素は、それだけに新しいノードにノードポインタを変更する必要がある場合に挿入されている親ノードと子ノードを指し、構造とほとんどリストの合流点までの道の接合部で、削除されていますポインタのみが操作は、ポインタに関連付けられている場合、動作させる必要がある場合、メモリを移動する必要はありません。
なぜ、各挿入した後に、反復子の前に失敗しないのだろうか?
ベクター、各欠失及び挿入は、ポインタは、内部データの連続的な格納を保証するために起因する失敗する可能性のためにイテレータ指向ノードポインタメモリ反復子はメモリで、そこに変更されていない他のメモリ覆わ欠失および挿入することができますまたはメモリが解放、おそらく内部空間が十分ではありませんので、ので、この場合はitertator無効、元のデータ要素をコピーし、新しいメモリを必要とされています。
操作のセット
挿入要素は3つの操作を設定します。
- 値はペアに一致するオブジェクト戻る決意を.secondか否かに応じて、正常に挿入されるように、挿入されています。
- 位置pos値、新しい要素の位置に戻るが、必ずしも成功していない挿入の前に挿入。
- 反復は、すべての要素の)間隔[&最初、&最後に言えば、容器のセット内に挿入されます。
要素の削除を設定します。
- 容器セット内のすべての要素の要素値を除去するsize_type消去(値)は、除去要素の数を返します
- 空の消去(&POS)位置posにある要素を削除し、ノーリターン値
- 空の消去(&最初、&最後)の繰り返し間隔[&最初、&最後)を除去、ノーリターン値内の要素
- 明確な空()、コンテナセット内のすべての要素を削除します
要素のセットの検索:
- COUNT(値)は、要素値の設定値の要素の数を返します
- イテレータ)(戻り値の終わりを見つけることができない、位置値の嘘を返します(値)を見つけます
他の一般的に使用される方法は、設定します。
- 開始()、容器のセットの最初の要素を返します
- エンド()は、コンテナの集合の最後の要素を返します
- クリア()、コンテナのすべての要素のセットを削除
- 空()、セットが空の容器であるか否かを判断します
- MAX_SIZE()、戻ってコンテナのセットは、要素の最大数を含んでいてもよいです
- サイズ()、容器のこのセット内の要素の数を返します
- rbegin()、戻り値および終了()同じ
- )(同じ)(引き裂く、および値rbeginを返します