読者です 読者をやめる 読者になる 読者になる

劣等コンプレックス500%

身動きとれねえ 絵・プログラミング(C/C++/Java/Perl/PHP/Mysql)

【C++】C++で連想配列\HashMapの実装をしてみた

C++ STLunordered_mapを利用してリストからからO(1)で要素を取り出すコードを実装してみますー。。

ハッシュテーブルを使って高速に取り出すアレ。仕組みについてはあとで解説記事書きますわ


文字列をキー、オブジェクトは自作クラスで書いてます。

★おしながき
・格納
・参照
・キーの存在の有無
・キー指定して削除
・要素数取得
・全要素削除
・ループ内での削除
・ループで列挙


クラスはシンプルにint.stringのメンバのみ。

class CL{
public:
	int d;
	string s;

	CL(int _d, string _s) : d(_d), s(_s){

	}
};

以下コード

#include <unordered_map>
using namespace std;

	unordered_map<string, CL*> map;

	//格納
	map["鞄"] =     new CL(123, "かばん");
	map["serval"] = new CL(456, "さーばる");
	map["ねこ"] =   new CL(789, "すなねこ");
	map["あらーいさーん"] = new CL(111, "アライグマ");
	map["フェネック"] =     new CL(222, "Fennec");

	//参照
	CL *cl = map["鞄"];
	printf("refer [%d][%s]\n", cl->d, cl->s.c_str() );

	
	//キーの存在確認
	if(map.find("鞄") != map.end()){
		puts("あるよ!");
	}

	//キー指定して削除
	{
		auto itr = map.find("");
		itr = map.find("鞄");
		if(itr != map.end()) map.erase(itr);
	}

	
	//要素数取得
	printf("size: %d\n", map.size() );
	
	//全要素削除
	//map.clear();

	//ループ内で削除
	for(auto itr = map.begin(); itr != map.end();++itr){
		//キー指定して削除
		if(itr->first == "ねこ"){
			string s = itr->first;
			CL *cl =   itr->second;
			printf("delete. [%s][%d]\n", s.c_str(), cl->d);
			
			itr = map.erase(itr);
			itr--;
		}
	}
	//列挙
	for(auto itr = map.begin(); itr != map.end(); ++itr){
		string s = itr->first;
		CL *cl =   itr->second;

		printf("print: [%s][%d]\n", s.c_str(), cl->d);
	}