最近更新したページ
2013-10-20
2013-09-29
2013-09-23
2012-01-07
2011-11-09
2011-10-23
2011-10-09
2011-10-01
2011-09-29
2011-09-03
2011-08-07
2011-08-02
2011-07-29
2011-07-10
2011-05-05
2011-05-04
2011-04-24
2011-04-13
2011-04-05
2011-03-26
2011-02-18
2011-02-15
2010-12-26
2010-12-07
2010-12-05
2010-11-23
2010-09-28
2010-09-23
2010-08-26
2010-08-22
2010-07-16
2010-01-17
2010-01-11
2009-10-04
2009-08-21
2009-08-13
2009-06-18
2009-06-01
2009-04-29
2009-02-16
2009-02-11
2009-02-03
2008-07-22
2008-07-21
2008-07-15
2008-07-14
2008-07-13
2008-07-12
2008-07-08
2008-07-05
2008-06-28
2008-06-17
2008-06-05
2008-06-02
2008-06-01
2008-05-29
2008-05-26
2008-05-21
2008-05-19
2008-05-18
2007-10-31
2007-10-27
2007-09-28
2007-09-23
2007-09-17
2007-09-16
2007-09-14
2007-09-11
2007-06-18
2007-04-15
2006-12-21
2006-11-30
2006-11-22
2006-08-17
2006-03-29
2006-03-28
2006-03-27

STL コンテナ


 STL 自体相当なボリュームがあり、コンテナだけでもかなりボリュームがある。結局ページが増えた。

STL コンテナ


 STL を使うと、C/C++ と全く異なる表記が多く目立つ。
 しかし、動的配列の取り扱い、文字列の取り扱い、2分木データ構造の提供など、データ処理用高級言語仕様を容易に提供してくれるのは非常にありがたい。

編集

特殊コンテナ

string

 C/C++ 文字列処理 参照

bitset

 set/multiset と別物。true/felse を、1byte に詰め込んで利用する 0/1 データ処理セットらしい。

▲上へ

アダプタ

 基本的にシーケンスの機能を限定するアダプタをかぶせ提供される。一部機能拡張されたアダプタ(priority_queue)もある。シーケンスを使って代用することも可。

 STL アダプタ(sample)頁追加。頁追加したが内容はまだ無い。

priority_queue

 vector or queue のアダプタ付き機能限定版。通常値の大きな要素から取り出される。
 優先順位を内部的に sort(擬似的?)、又は、検索->ランダムアクセスで返す(?)、別管理のインデックスでランダムアクセスで返す(?)ようである。

queue

 deque or list のアダプタ付き機能限定版。「先入れ先だし」データ処理を少ない機能で提供する待ち行列。

stack

 vector, deque or list のアダプタ付き機能限定版。名前のとおり「スタック:LIFO(last-in first-out)」として機能する。Force のシュミレートに便利そう。

▲上へ

連想コンテナ

 二分木データ構造を提供する。メンバ関数は全て共通のようである。
 サンプルコードは連想コンテナ(sample)頁へ移動。
 C/C++ らしくないデータ処理が簡単に出きる。

map/multimap

 set/multiset をより複雑にした、2分木データ(tree)構造を提供。
 キーとなる部分を整数に限定しない構造になっている。

set/multiset

 集合を扱う2分木データ(tree)構造を提供。小さい値から検索できる。

▲上へ

シーケンス

 vector(動的配列) deque(両端待ち行列) と list を提供。
 STL シーケンス(sample)頁追加。頁追加したが殆ど内容が無い。

list

 データの追加削除に便利なコンテナ。追加データは自動的に sort される。ランダムアクセスは出来ない。
sample:list


deque

 deque は、見かけ上、円形構造の動的配列(両端の動的配列を何らかの方法で結合)を提供する。
 深く考えると面倒なので、vector をもっと弄りまわした配列と思えばよいと思う。

 deque は、ほぼ vector の機能を包有すると考えられるが、非連続領域を用いる場合もあるようなので、C++ の配列互換性は処理系依存?となるかもしれない。
 VC++2005 で試す限り、「配列添え字」と「実アドレス」は、意図的に添え字の「すげ替え」実行で「実アドレス」変更は極力避ける動作をしているようである。要するにインデックスが意図的に操作された配列なので、ポインタへアドレスを代入してのポインタ操作は「無理(C言語配列非互換)」と思われる。

 勿論、イテレータは、ポインタと異なりこれらを吸収し考慮して動くと思う。(但し、イテレータにも、寿命というのが有るらしい。※挿入、削除、etc … 使えなくなるタイミングが … ある。)

deque
1.正(推奨) 2.代替 3.誤 memo
要素の追加・挿入・削除
d.push.front( x )- - 配列の先頭に 要素 x を追加
d.pop_front() - - 先頭の要素を削除
※上記追加メンバ関数と vector のメンバ関数群(capacity,reserve を除く)を利用可能。
1.STL の正しい使い方。
2.代替 or 非推奨。
3.期待値が出ない。動かない。
※ d = deque it = イテレータ its = v.begin() ite = v.end() i = index x = 値 n = 要素数
※その他:operator[]

vector


 vector は、動的配列を提供する。
 v[i] の配列形式でアクセス可能(ポインタ代入での利用可能。添え字管理は自己責任)であるが、領域境界のチェックが行われないらしいので、できれるだけ v.at( i ) の使用(境界外アクセスで例外発生)が好ましいらしい。

※v[i] , *(p+i) はエラーチェックが無いため、v.at( i ) より高速になる可能性が高い。但しコンパイラの実装状態に依存する可能性あり。

vector
1.正(推奨) 2.代替 3.誤 memo
イテレータ
v.begin() - &v/v 配列の先頭(*2)イテレータを取得
v.end() - - 最後の要素+1 のイテレータを返す
v.rbegin() - - 逆反復子
v.rend() - - 逆反復子
参照・代入
v.at( i ) v[i] *(v+i) i は 配列要素数を超えない整数
v.at( i ) = x v[i]=x *(v+i)=x ※統一するのが望ましい
v.front() - - 先頭要素を返す
v.back() - - 末尾要素を返す
要素の追加・挿入・削除
v.push_back( x )- - 配列要素の末尾に x 追加(領域追加)
v.pop_back() - - 末尾の要素を削除(末尾要素の削除)
v.insert( it,x )- - 指定位置前へ 要素 x を挿入
v.insert( it,n,x )- - 指定位置前へ 要素 x を n 個挿入
v.insert( it,itf,itl )- - 指定位置前へ itf〜itl をコピー挿入
itf=iterator first itl=iterator last
v.erase( it ) - - 指定要素の削除
削除後次イテレータを返す
v.erase( itf,itl ) - - 指定範囲(itf-itl)要素削除
itf=iterator first itl=iterator last
削除後次イテレータを返す
v.clear() - - 要素全削除
要素数取得・要素数確保(予約)
v.empty() - - 要素数が空(0)なら true(1)
要素があれば felse(0) を返す
v.size() ite-its sizeof(v) sizeof関数では期待値出ず(*1)
ite=b.end() its=v.begin()
v.resize( n ) - - size の拡大・縮小(実際は縮小されない)
v.reserve( n ) - - v.capacity() を確保する
v.capacity() - - 確保済み要素数を返す
v.max_size() - - 確保可能な最大要素数
その他
v.swap( v2 ) - - 簡単に配列要素の入れ替えが可能
v.assign( its2,ite2 )v=v2 - 簡単に配列をコピーできる
its2=v2.begin() ite2=b2.end()
v.assign( 20,0 )- - 配列サイズ指定
要素の値を指定値で初期化
1.STL の正しい使い方。
2.代替 or 非推奨。
3.期待値が出ない。動かない。
※ v = vector it = イテレータ its = v.begin() ite = v.end() i = index x = 値 n = 要素数
※その他:operator[]
(*1)v.size() の代用:v.end()-v.begin() or 同イテレータを使用した計算結果でも可。
(*2)v.begin() , v.end() から、配列要素のアドレスを取ろうとするが、悉く失敗。
イテレータも同様。ポインタを使用することでようやく address が取れた。
その後 &(v.at(i)) でも取れることに気づく。

※要注意点:v は配列の先頭アドレスを持たない。v≠v[0] である。
※注意点他のサンプルはSTL シーケンス(sample)頁へ移動。

▲上へ

コンテナとメンバ関数

 コンテナは、データ要素の実態+データ処理メンバ関数を含めた機能を提供する。ベクトル配列のソートなど「メンバ関数」にない機能でも、アルゴリズム(外部汎用関数)の sort() 他多数提供される。

※各コンテナとメンバ関数の対応表は、メンバ関数専用頁へ移動。

▲上へ

コンテナの分類

※覚書き:内容非保証

コンテナ(データ構造) .h memo
1)シーケンス
vector 動的配列 vecttor※C 配列(一部)互換。
deque 両端キュー deque Double Ended QUEue
list 双方向リスト list
※他 slist,bit_vector
2)連想コンテナ
set セット(集合) set
multiset マルチセット set
map マップ(連想配列) map
multimap マルチマップ map
※他、hash_set,hash_map,hash_multiset,hash_multimap,hash
3)コンテナアダプタ
stack スタック stack
queue キュー queue
priority_queue優先順位付きキュー queue
※アダプタ
4)特殊コンテナ
bitset ビットセット set or 2)連想コンテナ
basic_string ストリング string or String package
※特殊コンテナ 他、rope / String package -> Character Traits,char_traits

※string クラスは、STL に含める場合と、独立した機能と見る場合がある模様。
※個人的見解として、string は、STL に含まない機能という解釈がどこかにある。(特に根拠は無い。)

▲上へ

リンク


内部リンク


外部リンク


  • 現在ありません

▲上へ
2008年06月02日(月) 12:26:56 Modified by cafeboy1




スマートフォン版で見る