基礎知識

ANSI C++

C++の標準規格を制定しているのは、ANSI と呼ばれる業界団体です。

Microsoft の Visual C++ や Borland の C++ Builder、GNU の g++ など、ほとんどのコンパイラが ANSI C++ 準拠をうたっています。ANSI C++のみで書かれたプログラムは、OSやコンパイラを問わず、どの環境でもコンパイルして動かすことができる…はずです。

もっとも、Visual C++ は ANSI C++ への対応が若干遅れているようですが…

STLとは

最近のC++には、STL (Standard Template Library : 標準テンプレートライブラリー) と呼ばれる、基本的なデータ構造やアルゴリズムに汎用性を持たせたライブラリーが付いてきます。STLを利用するのと利用しないのとでは、開発効率が3倍くらい違うような気がします。

たとえば、整数を配列として使う場合、従来なら次のようにコーディングするでしょう。

int vec[3];
vec[0] = 7;
vec[1] = vec[0] + 3;
vec[2] = vec[0] + vec[1];

ところが、これでは決まった大きさの配列しか作れません(上記だと3つ)ので、適当な大きさの配列を動的に作るためには

int* vec = new int[size];
vec[0] = 7;
vec[1] = vec[0] + 3;
vec[2] = vec[0] + vec[1];
delete vec;

などとするでしょう。

さて、この配列の大きさを2倍にしたいとき、どうすればよいでしょう? 従来の方法なら

int* vec = new int[size];
vec[0] = 7;
vec[1] = vec[0] + 3;
vec[2] = vec[0] + vec[1];

int* tmp = new int[size * 2];
for (int i=0; i<size; i++)
	tmp[i] = vec[i];

int* tmp2 = vec;
vec = tmp;
delete tmp2;

size = size * 2;

などとするはず。ところが、これを何度もいろいろな場所に書くのは面倒なので、たいていそれを関数にするはずです。そして、その関数を resize() などと名付けるでしょう。

しかし、できれば、これを char型 や long型 など、いろんな型やクラスの配列にも応用したいと思いませんか?

そうした経緯から、任意の型を配列にすることができ、しかもあらかじめよく使う関数がまとまっているという、夢のような配列 vector が生まれたのです。

vector では、配列の大きさは

vector<int> vec(size);
vec.resize(size * 2);

と、簡単に書けますし、多くの delete 文も記述する必要がありません。vector の直後の <...> 内を任意の型/構造体/クラスに代えることにより、どんな値・オブジェクトでも格納できます。

このように、よく利用するデータ構造 (コンテナ) と、それに対する関数 (アルゴリズム) をまとめたライブラリーが、Standard Template Library なのです。

Standardという名前の通り、ANSI/ISO によって標準規格に制定されていますから、最近のコンパイラなら OS や発売元に依らず、どんな環境でも利用できるのも強みです。

詳しく書き始めると、それだけでずいぶんなページ量になってしまうので、角正史さんSTLのページ なんかを参考にしてみてください。