11、C++Primer 4 thノート、関連容器(1)

5593 ワード

1、関連コンテナと順序コンテナの本質的な違いは、関連コンテナはキー(key)によって要素を格納し、読み出し、順序コンテナは要素によって容器内の位置で要素を順次格納し、アクセスすることである.
2、mapの要素はキー-値(key-value)対の形式で組織されている:キーはmap内の要素のインデックスとして使用され、値は格納され、読み込まれたデータを表す.
3、関連コンテナタイプ
map
≪関連配列|Association Array|oem_src≫:要素はキーによって格納および読み込みされます.
set
キーによる高速読み取りをサポートする可変サイズのコレクション
multimap
同じキーが複数回現れるmapタイプをサポート
multiset
同じキーが複数回現れるsetタイプをサポート
4、pairタイプ
pairsタイプで提供される操作
pair p1;
空のpairオブジェクトを作成します.2つの要素はそれぞれT 1とT 2タイプで、値を使用して初期化されます.
pair p1(v1, v2);
2つの要素がT 1とT 2であるpairオブジェクトを作成します.firstメンバーはv 1に初期化され、secondメンバーはv 2に初期化されます.
make_pair(v1, v2)
v 1とv 2の値で新しいpairオブジェクトを作成します.要素タイプはv 1とv 2のタイプです.
p1 < p2
2つのpairオブジェクト間の演算が小さい場合、その定義は辞書の順序に従う:p 1.first < p2.firstか!(p2.first < p1.first) && p1.second < p2.secondはtrueを返します
p1 == p2
2つのpairオブジェクトのfirstメンバーとsecondメンバーが順次等しい場合、この2つのオブジェクトは等しい.この演算には、要素の==オペレータが使用されます.
p.first
pのfirstという名前のデータメンバーを返します.
p.second
pを返すsecondというデータメンバー
5、map構造関数
map m;
mという名前の空のmapオブジェクトを作成します.キーと値のタイプはそれぞれkとvです.
map m(m2);
m 2のコピーmを作成します.mとm 2には同じキータイプと値タイプが必要です.
map m(b,e);
mapタイプのオブジェクトmを作成し、反復器bおよびeタグの範囲内のすべての要素のコピーを格納します.要素のタイプはpairに変換できる必要があります.
6、すべての比較関数は、キータイプに厳密な弱いソートを定義する必要があります.すなわち、キータイプには<オペレータを定義する必要があります.
7、map定義のタイプ
map::key_type
mapコンテナでインデックスとして使用されるキーのタイプ
map::mapped_type
mapコンテナで、キーに関連付けられた値のタイプ
map::value_type
first要素にconst map::key_typeタイプ、second要素はmap::mapped_typeタイプ;値メンバーは変更できますが、キーメンバーは変更できません.
map反復器をデリファレンスするとpairタイプのオブジェクトが生成されます.存在しない要素に下付きラベルでアクセスすると、mapコンテナに新しい要素が追加され、そのキーが下付きラベル値になります.クラスタイプの要素はデフォルトのコンストラクション関数で初期化され、組み込みタイプの要素は0に初期化されます.
8、map反復器はvalue_を返すtypeタイプの値-const keyを含むtypeとmapped_typeタイプメンバーのpairオブジェクト;下付きオペレータはmapped_を返します.typeタイプの値.
9、map挿入データ
m.insert(e) 
eはmに使われるvalueですtypeタイプの値.キー(e.first)がmにない場合は、e.secondの値を持つ新しい要素を挿入します.このキーがmに既に存在する場合、mは保持されます.この関数は、e.firstキーの要素を指すmap反復器と、boolタイプのオブジェクトを返します.この要素が挿入されているかどうかを示します.
m.insert(beg,end)
begとendは、要素の範囲をマークする反復器で、要素はm.value_でなければなりません.type
タイプのキー-値のペア.この範囲内のすべての要素について、そのキーがmに存在しない場合、そのキーとその関連する値をmに挿入します.voidタイプを返す
m.insert(iter,e)
eはmに使われるvalueですtypeタイプの値.キー(e.first)がmにない場合は、新しい要素を作成し、反復器iterを起点として新しい要素が格納されている場所を検索します.m内の所与のキーを持つ要素を指す反復器を返します.
word_count.insert(map<string, int>::value_type("Annna", 1));

//the following is equivalent to the above

word_count.insert(make_pair("Anna", 1));

pair<map<string, int>::iterator, bool> ret =  word_count.insert(make_pair(word, 1));


10、map検索
m.count(k)
mにおけるkの出現回数を返す
m.find(k)
mコンテナにkインデックスの要素が存在する場合、その要素を指す反復器が返されます.存在しない場合は、エンド反復器を超えて戻ります.
11、map削除
m.erase(k)
mのキーがkの要素を削除します.size_を返しますtypeタイプの値は、削除された要素の数を表します.
m.erase(p)
mから反復器pが指す要素を削除します.pは、mに確かに存在する要素を指し、m.end()に等しくない.voidを返す
m.erase(b, e)
mから範囲内の要素を削除します.この範囲は反復器対bおよびeでマークされます.bおよびeは、mの有効範囲をマークしなければならない.すなわち、bおよびeは、mの要素または最後の要素の次の位置を指さなければならない.また、bとeは等しいか(このとき削除された範囲が空であるか)、bが指す要素はeが指す要素の前に現れなければならない.voidタイプを返す
12、set
setコンテナは単純なキーの集合にすぎず,1つの値が存在するかどうかを知りたい場合にsetを用いるのが適している.setはinsert,count,find,erase操作などのmap操作の大部分をサポートする.2つの例外:setは下付きオペレータをサポートせず、mapped_を定義していません.typeタイプ.setコンテナでvalue_typeはpairタイプではなくkey_とtypeは同じタイプです.これらはsetに格納されている要素タイプを指します.この違いは、setが格納する要素がキーのみであり、関連する値がないことも示している.mapと同様にsetコンテナに格納されているキーも一意で、変更できません.
一例プログラム
#include "map"

#include "string"

#include "fstream"

#include "iostream"

#include "sstream"

using namespace std;



// opens in binding it to the given file

ifstream& open_file(ifstream &in, const string &file)

{

	in.close(); // close in case it was already open

	in.clear(); // clear any existing errors

	// if the open fails, the stream will be in an invalid state

	in.open(file.c_str()); // open the file we were given

	return in; // condition state is good if open succeeded

}



int main(int argc, char **argv)

{

	map<string, string> trans_map;

    string key, value;

	if (argc != 3)

		throw runtime_error("Wrong number of arguments");

	ifstream map_file;

	if (!open_file(map_file, argv[1]))

		throw runtime_error("No transformation file");

	while (map_file >> key >>value)

	{

		trans_map.insert(make_pair(key, value));

	}



	ifstream input;

	if (!open_file(input, argv[2]))

	{

		throw runtime_error("No input file");

	}

	string line;

	while (getline(input, line))

	{

		istringstream mystream(line);

		string word;

		bool firstword = true;

		while (mystream >> word)

		{

			map<string, string>::iterator map_it = trans_map.find(word);

			if (trans_map.end() != map_it)

				word = map_it->second;

			if (firstword)

				firstword = false;

			else

				cout << " ";

			cout << word;

		}

		cout << endl;

	}

	return 0;

}


参照先:
[1] http://blog.163.com/zhoumhan_0351/blog/static/399542272010227112325224/
http://blog.163.com/zhoumhan_0351/blog/static/39954227201032392545410/