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のページ なんかを参考にしてみてください。