2008年11月19日

ソコにSTLがあるから。

最近、会社への行き来の時間にゲームで遊ぶことが
日課になりつつある今日この頃電車
電車の乗り過ごしには気をつけないといけないですね・・・がく〜(落胆した顔)
こんにちは、ハラです。

前回に引き続き、今回もSTLについて触れてみたいと思います。
今回は、連想コンテナであるmapについての小ネタです。

1operator[]とinsertメソッドを使い分ける
mapに対して新たに要素を追加する場合、
operator[]とinsertメソッドの2つの方法があります。
実際に書くとこんな感じです。左斜め下

DataObjectMap dataMap;

// キー「1」値「100」として追加
dataMap[1] = 100;

// キー「2」値「200」として追加
dataMap.insert(DataObjectMap::value_type(2, 200));

一見するとoperator[]の方を使いたくなりますね。
なんと言っても見やすいひらめき

ですが、この2つはちょっとした違いがあります。
operator[]の場合、insertメソッドと比べて、一時的なオブジェクトの
生成と破棄が余分に行われますたらーっ(汗)

今回のコードでは、オブジェクトといっても通常の整数型なので
生成と破棄のコストを気にすることはありませんが、
複雑で巨大なオブジェクトの場合は、気にする必要が出てくるかもしれません。
そんな時は、ちょっと長いinsertメソッドを使ってみてください。

2ポインタを入れる場合は、解放タイミングに注意を
解放を忘れない・・・・当たり前のことではありますが、
追加と削除が行われる頻度の高いmapではちょっと大変です。

mapは、自分が管理しているオブジェクトが
何処から参照されているかを知りませんバッド(下向き矢印)

そのため、ポインタを解放してよいかどうかを自分で管理することになります。
対策としては、「参照カウンタを導入する」などでしょうか。

もしくは全体を見直して、最初に要素を追加、
最後に全ての要素を解放と出来るようにするのも良いかと思います。

事前に準備をしておき、後で困ることなくmapの恩恵を受けたいものですね。


mapはとても便利な上、同じ機能を自分で作るとなると手間がかかります。
連想コンテナが必要になった時には、選択肢の1つとして考えてみてはどうでしょうかグッド(上向き矢印)

posted by 管理人 at 11:00 | Comment(0) | プログラミング