Transcript STL

Generic programming と STL
H107034 神谷 真輝
H107124 山下 陽平
Generic programmingとは
• データ型に依存しないプログラミングのこと
• たとえば
データ型に依存していると
→それぞれの型に対応したコードが必要
データ型に依存しないと
→コードは一つで十分
テンプレート
• テンプレート機能を使うことで
決まった型に依存しないプログラミングを!
• テンプレート関数
template <class T>
返り値の型 関数名(T& 引数)
{
T 変数名;
}
// T型の変数を定義
テンプレート
• クラステンプレート
template <class T>
class クラス名
{
メソッド名(const T prm_t) { m_t = pram_t}
T
m_t;
};
• 普通の関数、クラスと同じように扱える
• 引数、戻り値、ローカル変数が型に依存しない
STLとは
Standard Template Libraryの略。
C++の標準ライブラリの一つである。
テンプレート機能を最大限構成をとっており、
コンテナ、イテレータ、アルゴリズム、
関数オブジェクトからなっている。
コンテナ
• データを格納するもの
• ヘッダファイル名は使うコンテナ名と同じ
• コンテナの一覧
vector
list
実行時に配列の大きさを変えることができる配列
双方向にアクセス可能な線形リスト
queue
deque
stack
先入れ先出し(FIFO)のキュー
コンテナの両端からアクセスできるキュー
先入れ後出し(FILO)のスタック
…etc
イテレータ
• コンテナの各要素を参照するためのクラス
(配列の添え字、ポインタに近い)
• イテレータの種類
入力イテレータ、出力イテレータ、前方イテレータ
双方向イテレータ、ランダムアクセスイテレータ
※イテレータは変数として宣言して使用する
vector<class名>::iterator itr
= vect.begin();
vector<class名>::iterator itrEnd = vect.end();
アルゴリズム
• 一般的なアルゴリズムの意味ではなく、
イテレータで指定したコンテナへの操作を行う関数
• ヘッダファイル名はalgorithm
• 使えるアルゴリズムは標準で100以上存在する
コピー、ソート、最大値最少値、カウント、探索
置換、削除、並べ替え
…etc
• 基本的なアルゴリズムはまず存在する
→コードが数行で済むというメリット
関数オブジェクト
• オブジェクトを関数であるかのように扱うことができる
• 例
#include <cstdio>
#include <functional>
void Use_plus()
{
int i;
std::plus<int> cPlus; // 関数オブジェクト
i = cPlus( 100, 200 );
printf( "%d\n", i );
}
課題
• Int型のvectorコンテナに5つ数字を格納し、イテレータ
を用いて表示する。
• Studentクラス型のvectorコンテナを作る。
・メンバに名前(文字列),学年(数字),学籍番号(文字列)
・実行時、ユーザにメンバの値を入力させる。
• Studentクラスをソートする
・名前順
・学年順にソートし同学年の場合は学籍番号順
の二つを行い結果を表示する。
参考サイト
• STL samples
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
• STL(ソースコードのサンプル)
http://www.ne.jp/asahi/yamashita/programming/tips/stl.html
• C++のリファレンス
http://www.cppll.jp/cppreference/index.html