プログラムTIPS

DEMO PROGRAM ヘキサドライブでは様々な研究開発をしています。その一部を紹介。

ソコにSTLがあるから(2008年11月19日)

前回に引き続き、今回も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つとして考えてみてはどうでしょうか。

【免責事項】

本サイトが提供している情報に関しては、安全性等、いかなる保証もされません。 株式会社ヘキサドライブは、これらの情報をあなたが利用することによって生ずるいかなる損害に対しても一切責任を負いません。

【著作権】

本サイトが提供しているコンテンツについては、特に断りのある場合を除き、株式会社ヘキサドライブが著作権を有します。