病みつきエンジニアブログ

機械学習、Python、Scala、JavaScript、などなど

gcc 4.2 でC++11のSTLを使う

C++11(C++0x)が発表されてから一年経ちますが、いかがお過ごしでしょうか。
言語のコアが拡張されていますが、多くの方にはあまり関係ないことでしょう。
しかし、標準ライブラリは別です。新しい標準ライブラリ(Technical Report 1)では、メルセンヌ・ツイスタのような優れた乱数や、mapに変わるハッシュテーブル(unordered_map)等、今まで導入されていなかった(とうの昔に導入されるべきだった)ものが実装されています。

MacのXcodeによっていれられるコンパイラgcc 4.2で、gcc 4.2はC++11をサポートしていないようなので、基本的にはC++11xは使えないようです。ただし、標準ライブラリは言語仕様(C++11のこと)とは独立しているべきもので、gcc 4.2でも使うことは可能です。

#include <tr1/unordered_map> 
#include <tr1/random>

のようにtr1をつけてあげれば、includeできます。また、名前空間std:tr1になります。

おまけ

unordered_map は、map と違って参照渡しなどを使ってます。
そのため、キーに構造体やクラスなどを使っても高速になることが期待されます。自作ハッシュ関数、等価評価関数等を提供する必要がありますが
unordered_map::operator[]
map::operator[]
egtraさんのご指摘にありました通り、どちらも参照渡しです。

おまけ2

egtraさんのご指摘にありました通り、gccではなく、clangを使ったほうが良いようです。
gcc 4.2.1 は2007年の代物ですし、clangはAppleが資金提供しているようですし、gccではなくclangの方が最新機能が提供されそうです(llvm 3.1は2012年5月リリース)。
使い方は、コンパイル時、g++ではなくclang++を使えば良いです。(GCC Compatibilityがあると主張しているので、コンパイルのオプションなどはそのまま使えるようです)