2013.7.19 STLライブラリの学習

4768 ワード

STLは、コンテナ、反復器、関数オブジェクト、およびアルゴリズムを表すテンプレートのセットを提供する.
コンテナは配列に似たユニットで、いくつかの値を格納できます.コンテナは同質、すなわち格納された値のタイプが同じです.
アルゴリズムは、特定のタスクを完了するための処方です.
反復器はコンテナのオブジェクトを遍歴するために使用することができ,配列を遍歴できるポインタと同様に一般化されたポインタである.
関数オブジェクトは、ポインタとして使用されるため、クラスオブジェクトと関数ポインタ(関数名を含む)のような関数オブジェクトです.
STLは、配列、キュー、チェーンテーブルを含む様々なコンテナを構築し、様々な操作(検索、ソート、ランダム配列)を実行することができる.
 
STLはオブジェクト向けプログラミングではなく汎用プログラミング技術(generic programming)
 
一、vectorテンプレート類
1、1つのvectorオブジェクトを作成し、1つのvectorオブジェクトを別のオブジェクトに割り当て、【】オペレータを使用してvector要素にアクセスし、クラスが共通になった場合はテンプレートクラスとして設計する.これはSTLがヘッダファイルvectorで定義したvectorテンプレートです.
vectorはメモリを動的に割り当てます.
#include <vector>

using namespace std;

vector<int>ratings(5);

int n;

cin>>n;

vector<double>scores(n);

//  []  ,    vector                      

ratings[0]=9;

for(int i=0;i<n;i++)

cout<<score[i]<<endl;


2、分配器
int NUM=3;

    vector<int> rating(NUM);

    vector<string> titles(NUM);

   

    cout<<"you will enter
"<<NUM<<"booktitles and your rating"<<endl; int i; for (i=0; i<NUM; i++) { cout<<"enter title #"<<i+1<<":"<<endl; getline(cin, titles[i]); cout<<"enter your book rating"<<endl; cin>>rating[i]; cin.get(); } for (i=0; i<NUM; i++) { cout<<rating[i]<<':'<<titles[i]<<endl; }

3、ベクトルに対して実行可能な操作
size()はコンテナ内の要素の数を返し、swap()は2つのコンテナの内容を交換し、begin()はコンテナ内の最初の要素を指す反復器を返し、end()はコンテナの尾を超える反復器を返します.
反復器とは、一般化されたポインタです.実際には、ポインタであってもよいし、operator*()などのポインタのような操作を実行してもよいオブジェクトであってもよいし、各コンテナは適切な反復器を定義し、反復器はiteratorというtypedefであり、その役割ドメインはクラス全体です.たとえばvectorのdoubleタイプ仕様に反復器を宣言します.
vector::iterator pd;
vectorscores;//scoresはvectorのオブジェクトであると仮定します.
pd=scores.begin();
*pd=22.3;
++pd;
空の文字と末尾を超える文字の違い、空の文字は値であり、末尾を超える文字は要素を指すポインタ(反復器)です.
push_back()は、新しい要素をベクトルの末尾に追加する便利な方法です.そうすると、メモリ管理を担当し、ベクトルの長さを増やし、新しいメンバーを収容します.
 
    vector<int> rating;

    vector<string> titles;

    

    int temple;

    while (cin>>temple&&temple>=0) {

        rating.push_back(temple);

    }

    cout<<"you enterd"<<rating.size()<<endl;


Erase()メソッドは、ベクトル内の所与の区間の要素を削除し、2つの反復器パラメータを受信します.
scores.erase(scores.begin(),scores.begin()+2);
Insert()メソッドはerase()メソッドとは逆に,3つの反復器パラメータを受信する.
vectorold;
vectornew;
4、ベクトルに対して実行可能なその他の操作
STLは、すべてのコンテナクラスに適用される非メンバー関数find()を定義します.
3つの一般的なSTL関数を紹介します:for_each(),Random_shuffle(),sort()
for_each()は3つのパラメータを受信し、最初の2つはコンテナ内の区間を定義する反復器であり、最後の1つは関数を指すポインタ(最後のパラメータは関数オブジェクト)である.for_each()は、コンテナ区間の各要素に指向された関数を適用し、指向された要素はコンテナ要素の値を変更できません.for_を使うことができますeach()はforサイクルに代わる.
vector<Review>::iterator pr;

for (pr=books.begin(); pr!=books.end(); pr++)

            ShowReview(*pr);

//     

for_each (books.begin(),books.end(),ShowReview);

//               


Random_shuffle()は、2つの所定の区間の反復器パラメータを受信し、ランダムに配列する.
random_shuffle(books.begin(),books.end());
booksベクトルのすべての要素と、任意のコンテナクラスで使用可能なfor_をランダムに並べます.each()とは異なり、この関数はコンテナクラスがランダムにアクセスできることを要求し、vectorクラスはこれを行うことができる.
sort()クラスでは、コンテナがランダムアクセスをサポートできることも要求されます.
 
二、汎用プログラミング技術
オブジェクト向けプログラミングはプログラミングのデータ面に注目し,汎用プログラミング技術はアルゴリズムに注目する.間の共通点は抽象的で再利用可能なコードを作成することであるが,理念は決して動かない.
1、反復器を使用する理由
テンプレートはアルゴリズムをデータのストレージタイプとは独立させ、反復器はアルゴリズムを使用するコンテナタイプとは独立させる.
2、反復器タイプ
STLは5種類の反復器,入力反復器,出力反復器,順方向反復器,双方向反復器を定義し,反復器にランダムにアクセスする.
入力反復器は一方向反復器で、増分できますが、後退できません.
出力反復器はコンテナ値のみを変更でき、読み込めません.
順方向反復器は、常に一連の値を同じ順序で巡回します.マルチパスアルゴリズムを可能にする.データの読み取りと修正が可能であってもよいし、データの読み取りのみが可能であってもよい.
双方向反復双方向反復器は、順方向反復器であるため機能し、2つの減算オペレータを同時にサポートします.
ランダムアクセス反復器は、双方向反復器であるため機能し、ランダムアクセスをサポートする操作を追加します.
3、反復器の階層
4、容器の種類
11個の容器
5、シーケンス(sequence)
要件を追加することで、基本的なコンテナ概念を改善することができます. 
vectorはコンテナを反転することができ、最も簡単なシーケンスタイプであり、他のタイプの特殊な利点がプログラムの要求をよりよく満たすことができない限り、デフォルトではこのタイプが使用されます.
for_each(dice.begin(),dice.end(),Show);

cout<<endl;

for_each(dice.rbegin(),dice.rend(),Show);

cout<<endl;

dequeテンプレートクラスは、マルチオペレーションがシーケンスの開始と終了で発生した場合、dequeデータ構造を考慮するデュアル・エンド・キューを表します.
Listテンプレートクラスは、双方向チェーンテーブルlistがチェーンテーブルの任意の場所で挿入および削除される時間が同じであることを示し、要素の迅速な挿入と削除を強調します.listはコンテナを反転することもでき、vectorとは異なり、listは配列表現とランダムアクセスをサポートします.
6、連合容器
4種類
7、関数オブジェクト
8、アルゴリズム
  • 非修正シーケンス動作
  • 修正シーケンス動作
  • 並べ替えおよび関連アクション
  • 汎用デジタル演算