MENU閉じる

LAB

C++プログラムTIPS

研究室プログラムTIPSC++2008.11.19

ソコにSTLがあるから

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

1.operator[]と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つとして考えてみてはどうでしょうか。

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE