STLラーニングメモ--シーケンスコンテナ

11377 ワード

STLの順番容器は次のとおりです.
vector//高速ランダムアクセスをサポート
List//クイック挿入削除をサポート
deque//両端キュー
シーケンシャルコンテナアダプタ:
  stack        //LIFO
  queue       //FIFO
  priority_Queue//優先度管理のあるキュー
 
adapterアダプタの意味がよくわかりません.この言葉はあまりにもブエノスアイレスだ.以前接触したのは電源アダプタ、ネットワークアダプタなどで、私の頭の中で直接別の言葉に置き換えられます.例えば、変圧器、ネットカードなどです.多分特殊応用のツールという意味だと推測しています.
本題に戻ると、車輪を繰り返すのはずっと私が疲れていないことなので、STLを勉強するのは初めてです.
順番容器は、文字通り(テンプレートの定義によって)積み重ねられたものを順番に保管することを意味します.
初心者として最も多く使われているのは配列です.ただし配列は初期化時にサイズを設定する必要があります.動的に削除の需要が増えると、配列を使いにくくなります.この時はvectorで代用できます.
一、vector
vectorを使用する前に、ヘッダファイルを導入する必要があります.
#include
そして
using std::vector;
もちろん、面倒に限らず、vectorを宣言するたびにstd::vectorvec;
#include <iostream>
using namespace std;
#include <vector>
using std::vector;

struct Student
{
    int nCode;
    string strName;
};

int main()
{
    Student sts[] = {{4, "ddd"},{2, "bbb"},{6, "fff"},{3, "ccc"},{1, "aaa"},{5, "eee"}};
    vector<Student> vec(sts, sts+sizeof(sts)/sizeof(Student));
    vector<Student>::iterator iter = vec.begin();
    for(;iter!=vec.end();iter++){
        cout<<iter->nCode<<", "<<iter->strName<<endl;
    }
    system("pause");
    return 0;
}

vectorにはいくつかの構造関数があり、そのうちの1つは配列のコピーをvectorに変換するのに便利であるか、配列から区間を選択してコピーをvectorに変換することができる.
次にiterator(反復器)または下付き記号を使用して、コンテナ内の要素にすばやくアクセスします.
はい、訪問だけです.配列と同様に、下付き文字はアクセスにのみ使用され、削除などの下付き文字や反復器を使用するのは大きな間違いですよ.
反復器を使用する場合、最初の要素にアクセスする場合はvectorのメンバー関数begin()を使用して、最初の要素の反復器を返します.その後、*記号を使用して最初の要素にアクセスします.まるで針のようですね.メンバー関数end()を使用すると、最後の要素の末尾が返されます.この末尾は、反復器がコンテナの末尾に到達したことを示すだけで、最後の要素ではなく、コンテナ内の要素の遍歴が完了したことを判断するために使用できます.
反復器の位置を調整するには、算術オペレータを使用します.たとえば、中間の要素にすばやく配置するには、次のようにします.
  iter = vec.begin()+vec.size()/2;
vector要素にpush_を使用するbackは末尾に要素を挿入したり、他の方法を挿入したりして、必要なときに自分で選択すればいいです.
なお、vectorの要素を削除するたびに反復器の位置決めが変更される可能性があり、反復器を再使用する前に再配置する必要があります.
二、list
vectorと同様に、使用前にヘッダファイルを導入する必要があります.
#include
using std::list;
Listの操作方式はvectorと大きく異なる.大きな違いは、データの迅速な削除であり、その名の通りです.
また、listにはsortメンバー関数が1つ増え、要素をソートします.
上記のコード例では、コンテナに何人かの学生を乱順に追加し、次にリストコンテナに置き換えてソートします.
#include <iostream>
using namespace std;
#include <list>
using std::list;

struct Student
{
    int nCode;
    string strName;
};

bool Compfn(Student x,Student y)
{
    if(x.nCode>=y.nCode)
      return true;
   else
      return false;
}

int main()
{
    Student sts[] = {{4, "ddd"},{2, "bbb"},{6, "fff"},{3, "ccc"},{1, "aaa"},{5, "eee"}};
    list<Student> lst(sts, sts+sizeof(sts)/sizeof(Student));
    //list<Student>::iterator iter = lst.begin();//                  
    lst.sort(Compfn);
    list<Student>::iterator iter = lst.begin();
    for(;iter!=lst.end();iter++){
        cout<<iter->nCode<<", "<<iter->strName<<endl;
    }
    system("pause");
    return 0;
}

sort関数は昇順に並べ替えられており、すでに<記号タイプがある場合はlstを直接使用することができる.sort()はソートしますが、なければ実現する必要があります.
sort関数は、学生などのカスタムタイプではどのルールでソートされるか判断できないパラメータを受け入れることができ、名前のスペルに従うことができ、学号に従うことができ、昇順することができ、降順することができるなどです.このとき,この規則を決定するために関数を定義し,この関数ポインタがsortのパラメータである.
例えば前例のCompfn関数
この関数は、前者xと後者yの2つのパラメータを受け入れ、trueに戻ると両者の位置表示順序が正しく変換されず、逆にfalseに戻ると順序が正しくなく、位置を変換する必要があることを示す.ここでは、>=の場合にtrueを返すと降順に並べ替えられるなど、論理を変更できます.
またlistは下付きアクセスを提供していないようです.なぜかというと、この時の私はSTLを使いたいだけで、ソースコードを見たくないので、その名の通りチェーンテーブルならランダムアクセスは確かに便利ではありません.
同じ理屈で他を得る
他の順番も容器があまり差がありません.最後に私が学んだいくつかの小さな教訓について話します.
stackを使用するときにstackを巡回したいので、topにアクセスして要素をポップアップし、カウンタiを++操作します.結果表示される要素は半分しかありません..このカウンタi++の操作は本当に余計で、脳を動かさない機械的な労働の産物です.
もう一つのbitsetのものは興味深いですが、システム学習汎用型がないので、汎用型を類似関数パラメータとして使用するのは初めて見ました.
もともと汎用型はbitset<32>と書くこともできます.のどうしていっそ普通のクラスの構造関数に設計しないのですか.これはおかしい.またこのような汎用型も自分で真似して書いてみましたが、templateを使うのは大丈夫ですが、カスタムタイプであれば(例えばtemplate)だめです.
template<Student stu>
class Person
{
    int m_numb;
public:
    Person()
    {
        m_numb = stu->nCode;
        cout<<m_numb;
    }
};


int main()
{
    Student stu = {10};
    Person<stu> p;//error
    return 0;
}

なぜかというと、
C++primerの16.2.1節を学ぶことができます.
下記に修正すれば問題ありません.
template<Student* stu>
class Person
{
    int m_numb;
public:
    Person()
    {
        m_numb = stu->nCode;
        cout<<m_numb<<endl;
    }
};

Student stu = {10};

int main()
{
    stu.nCode = 100;
    Person<&stu> p;
    system("pause");
    return 0;
}

残りはゆっくり勉強し続けます.
毎日1元ずつ進歩して、3ヶ月蓄積すれば家に帰る運賃があります~