第五回-付録1:STL におけるリスト

ここでは、標準テンプレートライブラリにおけるリストの利用法を紹介する。

標準テンプレートライブラリ (STL) の list クラス

リストは便利なデータ構造であるので、C++ の標準テンプレートライブラリ (Standard Template Library: STL) にも含まれている。
第五回-03ではポインタ演算の練習として list を自分で記述してもらったが、 以下で見るようにライブラリに含まれる list クラスを利用することもできる。
ここではそれを体験してもらおう。

なお、STL は教科書 (独習 C++) の後半で触れられている。
興味のある人は自習してどんどん自分のプログラムに取り込んでみると良いだろう。

利用例は以下のようになる。

#include <iostream>
#include <list>   // list 利用のため
using namespace std;

int main(){

  list<int> l;   // int 型の list を宣言

  for(int i=0 ; i<10 ; i++){
    l.push_back(i);    // 末尾に挿入 (先頭に挿入は push_front)
  }

  // イテレータ (反復子) の定義
  list<int>::iterator pos;
  // イテレータをずらしながら、全てのデータを取り出す。
  for(pos=l.begin(); pos!=l.end(); ++pos){
      cout << *pos << "\n";
  }

  return(0);
}


list クラスの定義がないので非常に簡潔である。

見慣れないものがいくつかあるのに気づくだろう。 例えば、以下の記述

  list<int> l;   // int 型の list を宣言


は、int 型の list を定義している。
上で学んだ list クラスは int 型に決めうちしていたが、 STL の list は <> の内部に型名を記述することで、任意のデータを格納できる。
これは C++ のテンプレートという機能を使っている。 (これが「標準テンプレートライブラリ」と呼ばれるゆえんである)

また、list の任意の要素にアクセスするのに、イテレータ (反復子)というものを用いている。
イテレータをポインタのようなものと考え、for 文によってイテレータが list の全ての要素を動いてゆく、
と考えれば理解しやすいだろう。(ただし、正確にはイテレータは node を指すポインタではない)

←第五回課題解答第五回-付録 2 : STL における二分木、priority queue→

第五回トップページへ

クラスから入る C++ へ戻る