仕事で久しぶりにC++的なC++を書いたけれど、やっぱり難しい言語だなと改めて思った。
レガシーCプログラムの拡張中、試験的に辞書構造が必要になったのでstd::map
やstd::set
を使ってチョロリと書いた。ただ、次のような構造を作ろうとしたのだけれど:
map< string, set<string> >
これに格納する実データでは、map
の値となる文字列集合が複数のキー文字列と関連付いてある。しかも文字列集合のサイズはかなり大きい。すると上記では文字列集合が莫大な数コピーされてダメダメなので次のようにすればスッキリすると思う。
map< string, shared_ptr<set<string>> >
しかしstd::shared_ptr
が使えない古い処理系なので
map< string, const set<string>* >
vector< set<string>* >
という形にして、newしたset
はvector
で実体を管理しつつ、それらを指したポインタをmap
に入れてやる。こんなことをやって要件を満たした。やれやれだ。
自分は、set
に入るオブジェクトはコピーコンストラクタで挿入時にコピーされることを知っている。map
に入る値も同様にコピーされることも知っている。またset
に入れるのはstd::string
ではない自作のstd::basic_string
派生クラスなので、set
で扱えるようにそれ用のless-thanオペレーターの定義が必要になることも知っている。こういう細々としたことは、知らない人がコードを読んでも分かりにくい…というか分かるわけがないといつも思う。こんな言語を使って書いたプログラムを、プログラミングが好きでもない人達に引き継ぐのは大変なことだといつも思う。今回は辞書構造をゼロから作るのは労力的に無駄だと思い、久しぶりにC++に手を出したのだけれど…。他の人のことを考えると、やっぱりこの言語は使いたくないと改めて思った。