Column >【c++】mapを使うときの落とし穴
2016/12/18 【c++】mapを使うときの落とし穴

c++でmapクラスを使っていたときに詰まってしまった部分があるのでメモしておきます。

mapの中でキーが一番大きい要素を取り出そうとして下のようなプログラムを書きました。
#include <map>
#include <iostream>
using namespace std;

// 与えられたmapの中身を出力
void mpCout(map<int, int> mp){
	for(auto itr = mp.begin(); itr != mp.end(); itr++){
		cout << "mp[" << itr->first << "] : " << itr->second << endl;
	}
	cout << "--------------------" << endl;
}

int main() {
	map<int, int> mp;
	
	mp[30] = 30;
	mpCout(mp);
	
	int i = mp[mp.size() - 1];
	cout << "i : " << i << endl;
	mpCout(mp);
	
	return 0;
}
19行目でvectorを使うときと同じ感覚でsize()を使ってしまっています。
このときのmp.size() - 1は0になりますが、mpにはmp[30]にしか値が入っていないので、
値の入っていない場所を見ていることになります。

ですが、コンパイル時にはエラーにならず、出力結果は
mp[30] : 30
--------------------
i : 0
mp[0] : 0
mp[30] : 30
--------------------

というようになり、mp[0]に勝手に0が入ってしまいました。

キーの型がstring等の場合はコンパイルの時点でエラーが出るようですが、
intやdouble等を使っている場合はこのような事が起きてしまうみたいです。

このように、値が割り当てられていない部分を使わないようにするには
find()関数やcount()関数を使えば良いみたいです。
参考URL:http://minus9d.hatenablog.com/entry/20120607/1339073711

また、mapからキーが一番大きな要素が欲しいときは
max_element()関数というのを使えば良いようです。
参考URL:https://www.goto.info.waseda.ac.jp/~tobe/memo.html#map

    Please
    Share!
  • feedly
  • facebook
  • twitter
  • hatena bookmark
  • pocket
  • Google plus

inserted by FC2 system