気まぐれにSTL再考

そういえば、JavaArrayListとLinkedListはListインターフェイスにうけたほうが良いor受けるべき、みたいな議論をみかけて、
それは即ち「抽象化」であり、
可変長配列であろうと、連結リストであろうと、意識せずに使えるようにするのであり、
かつまた、内部を意識しなくても良いのだよ、
ってな話だったと思うんだけど、

C++っていうかSTLは違うんだよね。
STLは寧ろ、vectorとlistは別物だから一緒にすんな、
vectorにはvectorの、
listにはlistの最適な操作がある。

故に、vectorにはpush_front, pop_frontがないし、
listにはoperator[](ランダムアクセス)が存在しない。

要するに不適切(効率的ではない、相応しくないよう)な操作は赦すべきではなく、
実装を隠蔽する必要ってないんじゃない?
ってな思想な訳だ。

違うものを同じであるかのように扱えることは嬉しいことだけれど
盲目的にそれをしてはならない、という警鐘としてSTLのこの考えは素晴らしく思える。


これはC++をやっている以上、正しく思えることは間違いない。
なぜって? 双方向リストと、配列は違うものだからさ!

さておき、STLを初めて触ったときに自分が違和感を感じたのは「要素の削除」だった。
何らかの要素を持ったリストhogeListからインスタンスfooを消去する場合、
Cの連結リストなら、「自身にprevとnextのポインタを有しているだろうから」事は簡単に済む。
でも、listのコンテナに、hogeList.remove(foo);って怖くない?
vectorならまた違った削除がある
反復子(iterator)をとっておいてそれを使って削除すべきだとは思わなかった?
だって、連結リストなら自分で一瞬に自分を削除できるのにさ!

でも、C++にとっては「これが正義」だ。
それと同じで、JavaにはJavaの、C++にはC++の、RubyにはRubyの正義がある。


そーゆーことなんじゃないかなぁ。
STLにはSTLの正義があるってことさ!!