std::mapの落とし穴

注意: この記事は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を使った場合、ハマってしまう。

今回は幾つか代替処理を行ったため対処できたが、この部分が是非とも気をつけたいところである。

タイトルとURLをコピーしました