C++トリビアルメモ5 テンプレートとオブジェクトと

いろんな言語に手を出していると頭がごっちゃごちゃになってきます。
例えばstd::mapにstd::vectorを入れる場合。
中にポインタを入れておく場合は下記のような使い方かと思います。最初に使うときに初期化するという。JavaでHashMapにArrayListを突っ込むときとかはこんな感じじゃなかったかと思ってます(2年前の知識では)。


#include <vector>
#include <map>
#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
	map< int, vector< int >* > vectorMap;
	
	if (vectorMap.find(4) == vectorMap.end()) {
		vectorMap[4] = new vector< int >();
	}
	vectorMap[4].push_back(1);
	vectorMap[4].push_back(2);
	
	if (vectorMap.find(20) == vectorMap.end()) {
		vectorMap[20] = new vector< int >();
	}
	vectorMap[20].push_back(3);
	
	for (map< int, vector< int >* >::iterator it = vectorMap.begin(); it != vectorMap.end(); it++) {
		for (vector< int >::iterator ptr = it->second->begin(); ptr != it->second->end(); ptr++) {
			cout << "map[" << it->first << "] = " << *ptr << endl;
		}
	}
	
	return 0;
}

PHPとかだと配列なら$hoge[]=$fooってやれば勝手に初期化されるので気にしないかもしれません。で、C++でもポインタを入れない場合は気にしなくていいわけです。


#include <vector>
#include <map>
#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
	map< int, vector< int > > vectorMap;
	
	vectorMap[4].push_back(1);
	vectorMap[4].push_back(2);
	vectorMap[20].push_back(3);
	
	for (map< int, vector< int > >::iterator it = vectorMap.begin(); it != vectorMap.end(); it++) {
		for (vector< int >::iterator ptr = it->second.begin(); ptr != it->second.end(); ptr++) {
			cout << "map[" << it->first << "] = " << *ptr << endl;
		}
	}
	
	return 0;
}

これ下のやつでいいのかなあ。上のやつは実はメモリリークしてるしなあ。下の方法はvectorのコンストラクタがmapの内部で2回呼ばれる(正確にはデフォルトコンストラクタとコピーコンストラクタが1回づつかな?)ため若干効率が悪いのかもしれない。vectorならまだしもコンストラクタが重いクラスだとだめなのかも。上のやつはスマートポインタとかを使えばいいのかもしれないけれども、あんまり信用してないというか使ったことないぜ!今度使ってみよう。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C++ パーマリンク

コメントを残す

メールアドレスが公開されることはありません。