最近更新したページ
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

C/C++ STL(Standard Template Library)


※結局、頁追加となった…>更にページが増殖した…。

STL(スタンダード・テンプレート・ライブラリ)


イテレータ


 イテレータは、コンテナ操作で便利なポインタのような物である。

vector<int> vi;
〜
vector<int>::iterator it = vi.begin();
int i=0;
for( ; it < vi.end() ; it++ ) {
   printf("vi.at( %d ):%d ", i,vi.at( i++ ) );
   printf("*it:%d \n",       *it);             // vi.at( i ) と同じ
}
※この、ポインタのようでポインタと呼ばない it が、イテレータと呼ばれる。(又は、イテレータとして機能する)
※イテレータは、基本的にポインタと互換性を持つが、コンテナの種類、イテレータの種類により制限がある。

▲上へ

イテレータの種類


  • イテレータ:iterator(反復子)の種類
    • 1).入力イテレータ:nput iterator
      • 要素:(*)読み取り専用
      • ポインタ:(++)インクリメント
    • 2).出力イテレータ:output iterator
      • 要素:(*)書き込み専用
      • ポインタ:(++)インクリメント
    • 3).前方イテレータ:forward iterator
      • 要素:(*)読み書き可能
      • ポインタ:(++)インクリメント
    • 4).双方向イテレータ:bidirectional iterator
      list,set,map
      • 要素:(*)読み書き可能
      • ポインタ:(++)インクリメント、(--)デクリメント
    • 5).ランダムアクセスイテレータ:random access iterator
      vector,deque
      • 要素:(*)読み書き可能
      • ポインタ1:(++)インクリメント、(--)デクリメント
      • ポインタ2:インデックスの直接指定(ランダムアクセス)

汎用性: ( 5 > 1,2,3,4 ) ( 4 > 1,2,3 ) ( 3 > 1,2 )

利用例


ループの例
vector<int> v;
〜
vector<int>::iterator it; // イテレータ
for (it=v.begin(); it != v.end(); it++) {
   cout << *it << " ";
}


コンテナ


▲上へ

コンテナの使い方


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

 「STL コンテナ」頁へ「コンテナの使い方」関連の詳細(vector…とか…)は、移動しました。

コンテナの詳細

※覚書き:内容非保証

  • コンテナクラス(Container classes)
    • 1) シーケンス(Sequences)
    • 2) 連想コンテナ(Associative Containers)
    • 3) コンテナアダプタ(Container Adapters)
    • 4) 特殊コンテナ
      • bitset は「連想コンテナ」グループと見なす向きあり。又は、bitset 単体でグループ分け。
      • basic_string も、STL のグループと見なす向きあり。この場合「特殊コンテナ」又は「String package」のグループとなるようである。

▲上へ

HP/ANSI/CLR と STL


 string は、有用性が高いためか書籍でも多くみかける。しかし、他のコンテナの解説を見かけることは少ない。
 元来 STL は、HP より派生し その後 ANSI C++ 標準化 されたようであるが、この辺りで STL へ取り込まれたのかもしれない?(内容非保証:根拠無し)

 STL には、HP STL -> ANSI C++ ANSI STL という流れがあり、前者は、主にデータ処理のパッケージング、後者は、C++ の機能拡張標準化 と少し意味合いが異なるようにも感じられる。

(※なんかややこしい...)

 それ以降も、Boost(Boost C++ Libraries) 等(全部ではないが...一部)を取り込みながら、ANSI C++ は拡張を続けているようで、後者で言うところの STL とは、拡張された「標準テンプレートライブラリ」を STL と呼称しているようなので、機能は追加されていくものと思われる。

 更にややこしいことに、STL/CLR という MS版(.NET Framework版) が存在する。
 STL/CLR とは C++/CLI版 STL とも言えるが、厳密には MS拡張も多分有ると思われるので?である。Win32 と .NET のプログラム記述が相当異なるので、STL/CLR は別物(別知識の習得が必須)と取り合えず考えた方が無難な感じはする。

※.NET で難解な C++ を使うメリットが全く見出せない。ネイティブコード と .NET 混在、その連携性の高さは何となく判るのだが...

▲上へ

STL の概要


STL(Standard Template Library)とは?

 データ構造やアルゴリズムを扱うための C++ ライブラリ。
 動的配列やリンクリストといったデータ構造を扱うためのコンテナ、ソートや二分探索などを行う関数を備える。
 C++ のテンプレート機能を利用しており、データの型によらずに利用できる。ISO/ANSI が定めた標準C++ライブラリの一部で、多くの C++コンパイラに付属している。
 ※要するに複雑なデータをより簡単に利用できる C++ の拡張機能と言うことらしい。

▲上へ

コンテナ

 コンテナとは、簡単に言うと操作機能を持ったデータ(クラス)そのもの。
 その種類は、vector, list, queue, stack, map, set ...等、データの取扱、処理方法によりこれらのコンテナから選択データの格納や処理に利用する。

  • vector(動的な配列)
    • 難解な処理となりがちな「動的配列」の生成、サイズ変更(要素数)、動的配列の削除(?これは未確認!してくれると「うれしいなぁ」と言う希望のみで書いてある・・・が、.NET Framework なら可と思われるが、Win32 じゃ無理だよね!(なんかの時に再度調べておこうと思う。))とランダムアクセスを簡単にしてくれるコンテナ。
    • 欠点:要素の追加、削除が多いと「動的配列」を作り直して機能を維持するため処理が遅くなる。
  • list(双方向リスト)
    • 配列データのシーケンシャル処理に向いたコンテナ。
    • データの追加・削除も容易に可能。
    • ランダム処理には向かない。
  • queue(キュー)
    • 先入れ先出し(FIFO)バッファを利用したデータ構造のコンテナ。
    • ※他に deque, priority_queue と言ったコンテナも有るが、使用目的は異なる。
  • stack(スタック)
    • 先入れ後出し(FILO)バッファ構造のコンテナ。※生もの厳禁 ...冗談... (^^;)
  • multimap(マルチマップ)
    • 表を作るのに適し自動でソートされるコンテナ。
    • 複数のデータを管理できる。
    • multimap は、unique な key でなくとも(重複キーが)許される。
    • ※通常 TreeMap(木構造)のデータ形式(構造)で実現される。
    • ※multimap の他、map も有り。違いは重複キーの可否。
  • multiset(マルチセット)
    • 登録データが自動でソートされるコンテナ。
    • map と異なり単一データ管理。
    • multiset は、unique な key でなくとも(重複キーが)許される。
    • ※通常 TreeSet(木構造)のデータ形式(構造)で実現される。
    • ※multiset の他、set も有り。違いは重複キーの可否。
  • bitset(ビットセット)
    • 真理値の2値を最小単位で格納しておけるコンテナらしい。例えば通常の bool型 は、単に 1 or 0 を保持するために 1byte を消費するが、同 1byte なら、8つまでの bitset に纏めて保持できるコンテナ。
    • ※論理演算で実現できない機能ではない・・・気もする・・・が、あれば便利かも。

▲上へ

共通アルゴリズム

 STL のアルゴリズムとは、コンテナから処理対象の開始位置と終了位置を指定した上で、対象要素へ希望する処理(例:並べ替え、検索、登録、削除・・・等)を行うことである。
 STL では、これらの操作を行うための共通した「アルゴリズム」が存在し、その操作対象が「コンテナ」(データ・オブジェクト)であり、それを操作するのが「アルゴリズム」である。
 アルゴリズムは非常に数多く存在し、多くの場合 <algorithm> を include して利用することが出来る。
 
※要するに、コンテナを操作する関数(クラス)を指しているようであるが、そのパラメータは、・・・アルゴリズム(開始位置,終了位置,値);・・・ の様に標準化(定型化)されており、数は多いが殆どの場合、知識の使い回しで容易に利用が出来るといった特徴がある。
※面倒なので簡単に書くと、通常のデータ型に当たる物が「コンテナ」、それを加工する関数を「アルゴリズム」と呼んでいるだけ!・・・っと乱暴に捕らえた方が判りやすい。
※厳密には違うと思うので・・・若干補足:C/C++(STLを除く) に、有ると便利な物(オブジェクト)をクラスを駆使し添付された機能群が「標準テンプレートライブラリ(STL)」である。これにより他の高級言語に及ばずとも、近い生産性が提供されている。

▲上へ

イテレータ(反復子)

 「コンテナ(オブジェクト)」を「アルゴリズム(関数)」を使用し、各種加工、データ取得を行うわけだが、アルゴリズムはトドの詰まり関数なので、引数(開始位置、終了位置、値)を渡す必要がある。この引数に当たる物が「イテレータ」と呼ばれる。
 「イテレータ」自体もクラスであり、そのクラスのポインタを介し「アルゴリズム」から「コンテナ」を操作する。

  • イテレータ-- p++(Increment), p--(Decrement), *p など、イテレータはポイント同様に、アドレスの加減算、値の取得が出来る。(※イテレータを p と表記)
    • container.begin()
      コンテナのメンバ関数:コンテナ要素の先頭位置を取得
    • container.end()
      コンテナのメンバ関数:コンテナ要素の終了位置を取得

// container -------------> ctr_v 定義
std::vector<int> ctr_v;
// algorithm -------------> sort()
// iterata   -------------> ctr_v.begin(), ctr_v.end()
std::sort(ctr_v.begin(), ctr_v.end());                 // 昇順
std::sort(ctr_v.begin(), ctr_v.end(), greater<int>()); // 降順
※多分、こういった関係と思われる。(※内容非保証)

コンテナパラメータなど、ほぼ共通化されているようで、こうした STL のコンテナ仕様の総称をイテレータと呼ぶらしい。(正誤不明、内容非保証)

▲上へ

関数オブジェクト

 共通仕様により、共用できる関数オブジェクトが揃っているらしい。(内容非保証)
 どういったものか?今一つ理解不能状態。

  • 関数オブジェクトとは?
    • C++ の他 java, python, ruby, lisp など、オブジェクト指向言語の多くが、関数オブジェクト定義をサポートしており、C++ の STL 専用の機能ではない。
    • だいぶ難解だが、C の qsort() に、比較要素の状態を判断する関数のポインタを渡して実行する仕様があるが、それに近いものがあるように思われる。
      ※それも仕様に合せ関数を作り、仕様に合せ関数のポインタを渡すが、その動作は qsort() が渡した関数を内部で勝手に呼び出して処理を続行している。

※関数オブジェクトの結論:sort を使う上で熟知して無くても取り合えず問題なさそうなので同でも良い。必要があれば、また脱線すれば良いかなっと言う程度で終了。(クラス同様(又はクラスの一部?)奥が深そうなので撤退)

▲上へ

※STL を使うとコード短縮が可能となるようだが、C言語とかけ離れた文体のため、使い始めると、クラス同様切りが無い感じである。sort 使うためだけの知識を詰め込んで「終了〜!」としたいところである。

Standard Template Library Samples

・・・終了せずに、ページが増えた・・・

▲上へ

リンク


内部リンク


外部リンク


  • 現在ありません

▲上へ
2008年05月29日(木) 18:42:05 Modified by cafeboy1




スマートフォン版で見る

×

この広告は60日間更新がないwikiに表示されております。