注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。
これは、paizaオンラインハッカソンVol.8 恋するハッカソン〜君色に染まるアイドル〜のとある問題でstd::map
を使った時に気付いたことなのだが、これは使い方に注意が必要なものである。ここではその注意点をコードを交えながら気をつけたいことを書き記してみたい。
std::map
は、新たに作った時は基本的にキーと値のペアーが全くない状態で作成されるが、値のないキーを参照した時に、自動的にペアーが追加されるという挙動を見せる。例えば以下のようなコードがある。
#include <iostream>
#include <map>
using namespace std;
int main(void){
// Here your code !
map<int, int> nummap;
cout << "size: " << nummap.size() << endl;
nummap[0];
cout << "size: " << nummap.size() << endl;
cout << "val : " << nummap[0] << endl;
return 0;
}
この場合、実行すると以下のようになる。
size: 0
size: 1
val : 0
上記の場合、std::map
オブジェクトを作成した直後は空っぽ。その後、0をキーとして参照した段階キー0のペアーが作成されて、そのオブジェクトのsizeが1になったことになる。また、0をキーとした時の値は0となっていることが確認できる。他の型の場合もまた変わった値が指定される可能性が非常に高い。
これに気付かないと、今回のPOHのあるお題をC++かつstd::mapを使った場合、ハマってしまう。
今回は幾つか代替処理を行ったため対処できたが、この部分が是非とも気をつけたいところである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。