STLとC++標準関数ライブラリ(vector用法)


#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;

int main(void)
{
vector<int> num;   // STL  vector  
int element;

//            , 
//              
while (cin >> element)     //ctrl+Z      
   num.push_back(element);

// STL      
sort(num.begin(), num.end());

//               
for (int i = 0; i < num.size(); i ++)
   cout << num[i] << "
"; system("pause"); return 0; }

 
このプログラムの主な部分はSTLの部品を変えて、最初のプログラムより少し簡潔に見えますが、あなたはもうあの嫌いなcompare関数が見つかりません.本当にうまく機能しますか?プログラムの実行結果と前のほぼ差が少ないので、ここで省略してみてください.私はあなたに保証することができます.このプログラムは十分丈夫です.しかし、プログラムのコードがまだ完全に理解されていないかもしれません.だから、説明しなければなりません.結局、このトリックは早すぎて、最初のプログラムに比べて、あっという間に、古いC++プログラマーがよく知っているコードがなくなり、代わりに新鮮なものがあります.
プログラムの最初の3行はヘッダファイルで、プログラムで使用するすべてのC++プロパティを提供します.(入出力処理、STLのコンテナとアルゴリズムを含む).それを気にする必要はありません.私の油断ではありません.プログラムはコンパイルできることを保証します.あなたのC++コンパイラが標準C++規範の関連部分をサポートしている限り.普通のC++ヘッダファイルと見なせばいいだけです.実際には、この変化の詳細に興味があればあなたの隣の食事に気をつけてください.
4行目の存在も無視できます.その声明に参加したのは、STLの中のそれらがすべてそこに含まれているため、プログラムがstdという標準的な名前空間(namespace)に引用されたことを示すためだけです.この声明を通じて、コンパイラはそれらの面白い特性を使用することができます.
プログラムにはvectorが使用され、STLの標準コンテナであり、いくつかの要素を保存するために使用できます.vectorをint[?]と理解できますが、整数の配列.サイズが不明なのは、vectorはサイズを動的に調整できる容器であり、容器がいっぱいになったときに要素を入れるとvectorはこっそり自分の容量を拡大するからです.push_backはvectorコンテナのクラスメンバー関数で、コンテナの末端に要素を挿入します.main関数の最初のwhileループはvectorコンテナの末端に整数データを絶えず挿入し、コンテナ空間のサイズを自動的に維持することです.
sortは、コンテナ内の要素をソートするためのSTLの標準アルゴリズムです.コンテナ内のどの範囲の要素がソートできるかを決定するには、2つのパラメータが必要です.ここではvectorの別の2つのクラスメンバー関数を使用します.begin()はvectorの先端を指し、end()はvectorの末端を指す.ここで2つの問題があります.begin()とend()の戻り値は何ですか.これはSTLのもう一つの重要な部品である反復器(Iterator)に関連していますが、ここでは詳細を知る必要はありません.ポインタとしてだけでいいです.整数データを指すポインタです.対応するsort関数宣言はvoid sort(int*first,int*last)と見なすことができますが、これは実際には正確ではありません.もう一つの問題はend()関数に関係しており,前述の戻り値はvectorの末端を指しているが,この説は正確ではない.実際、その戻り値はvectorの最末端要素の後ろの位置、すなわちpass-the-end valueを指す.これはちょっとわかりにくいですが、気にする必要はありません.ここでは少しお話しします.総じて、sort関数が行うことは、その準整型配列の要素をソートすることであり、最初のプログラムのqsortのようになるが、qsortよりもsortのほうが簡単になるようだ.
プログラムの最後は出力部分で、ここでvectorは完全に偽乱真で、それが提供する要素へのアクセス方式はまるで普通のC++内蔵配列とそっくりです.そのsize関数はvectorの要素の個数を返すために使用され、最初のプログラムの変数nに相当する.この2行のコードは直感的に説明する必要はありません.
私の辛抱強い説明はあなたに上のプログラムを大体理解させることができると思います.実際にSTLの運用はプログラムの論理をもっとはっきりさせ、コードをもっと読みやすくします.誰がbegin、end、sizeという言葉の意味は?(彼が英語が分からない限り)?実行してみて、効果を見てみましょう.さらに数を多く入力してみて、配列の境界を越える現象が発生するかどうかを見てみましょう.実践は、プログラムの運行が良好であることを証明しています.はい、vector容器が自分の大きさを自分で維持しているため、C++プログラマーはダイナミックメモリの分配を心配する必要はありません.ポインタの誤った使用は結局多くの面倒をもたらすと同時に、プログラム冗長になります.