のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

C++11 unordered map(mapとは少し違うよー)

Sponsored Links

皆さんこんにちは
お元気ですか。早起きするとしんどいですね。

さて、今日はC++11で実装されたunordered mapとやらを見てみよう。

unordered_mapって?

C++11にて追加されたSTLです。
mapはTree構造で実装されているのに対し、unordered_mapはHashでの実装を実現しているそうです。
mapは自動的にソートが行われるのに対し、unordered_mapではソートが行われません。

使ってみよう

ヘッダーと宣言

#include <unordered_map> //ヘッダー
unordered_map<int,int> mp; //map

Access

at または mapと同じ

mp[0] = 2 + 4;
cout << mp[0] << endl;
cout << mp.at(0) << endl;
Size
cout << mp.size() << endl;

ループ

全て出力する方法を2通り

iterator
unordered_map<int,int>::iterator itr = mp.begin();
for(itr; itr != mp.end(); itr++){
	cout << itr->first << " " << itr->second << endl;
}
foreach
cout << "output unordered_map" << endl;
for(auto pair:mp){
	cout << pair.first << " " << pair.second << endl;
}

mapにコピー

map<int,int> normal_map(mp.begin(),mp.end());
for(auto pair:normal_map){
	cout << pair.first << " " << pair.second << endl;
}

これを利用することでソートを可能にします。

全て纏めたソースコード

#include <iostream>
#include <unordered_map>
#include <map>

using namespace std;

int main(int argc, char const *argv[]){
	unordered_map<int,int> mp;

	for(int i = 0; i < 10; i++){
		for(int j = 0; j < 10; j++){
			mp[i] = i + j;
		}
	}

	cout << "access" << endl;
	cout << mp[0] << endl;
	cout << mp.at(0) << endl;

	cout << "size" << endl;
	cout << mp.size() << endl;

	cout << "output unordered_map using iterator" << endl;
	unordered_map<int,int>::iterator itr = mp.begin();
	for(itr; itr != mp.end(); itr++){
		cout << itr->first << " " << itr->second << endl;
	}

	cout << "output unordered_map" << endl;
	for(auto pair:mp){
		cout << pair.first << " " << pair.second << endl;
	}

	cout << "copy to map" << endl;
	map<int,int> normal_map(mp.begin(),mp.end());
	for(auto pair:normal_map){
		cout << pair.first << " " << pair.second << endl;
	}
	return 0;
}