エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

定数マップに関する考察

QuickSortから始まってここまできましたが、なにをしたかったかというと、ダブルディスパッチのエントリで書いたように、「ローコストのスタティックなしくみ」を実現するための試みでした。

C++はライブラリでどうにかするタイプの言語なので、モダンな言語の多くが持っているような連想コンテナもライブラリで提供されます。ただ、標準ライブラリとしてはSTLが提供されていますが、STLを利用できないプロジェクトも少なくなく。で、自作してみたわけですが、思いのほかしっくりこない。
先のエントリでも書いたように、要素数が10や20ぐらいであれば線形検索でも充分用が足りると思います。なのでこういうしくみを使うとしたらそれ以上の要素数の場合になると思いますが、こんどは数百といった数になったらコードには埋め込まず、外部にデータファイルとして保存して動的に読み込むほうが扱いやすくなります。

また、key-valueのペアを、

static const SampleMap::value_type items[] =
{
    { 1, "one"   },
    // ...
    { 9, "nine"  }
};

…といったように配列で持つのと、

const char* map(int id)
{
    switch(id)
    {
    case 0:  return "zero";
    case 1:  return "one";
    case 2:  return "two";
    // ...
    case 9:  return "nine";
    default: throw std::out_of_range("map(int)");
    }
}

…といったようにコードで書くのとどう違うのか。もちろんデータと制御コードという違いはありますが、上記の関数を実質連想コンテナとしてだけ扱うと考えると、余分なコードを書く必要がない分よりスマートなのかもしれません。


ちょっとネガティブな結果ではありますが、連想コンテナについて再考する機会になったと思います。