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

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

  • 2008-06-26 (木) 1:17
  • C++

いろんな言語に手を出していると頭がごっちゃごちゃになってきます。
例えば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ならまだしもコンストラクタが重いクラスだとだめなのかも。上のやつはスマートポインタとかを使えばいいのかもしれないけれども、あんまり信用してないというか使ったことないぜ!今度使ってみよう。

以上

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=242
Listed below are links to weblogs that reference
C++トリビアルメモ5 テンプレートとオブジェクトと from コスミー報告書[社外秘]

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

Search
Feeds
Meta
 合計:011636
 今日:0107 昨日:0165

Return to page top