c++STL 標準クラス テンプレート ライブラリ (連想コンテナ (マップ、マルチマップ クラス テンプレート)、これら 2 つのコンテナの割り当て方法は他とは異なります)

このブログは、以前のブログの連想コンテナー (set、multiset) を引き継ぎますが、両者には類似点と相違点があり、マップ タイプとマルチマップ タイプの要素のデータとキー値は分離されていますが、セット、マルチセットマルチセット型の要素のデータとキー値は場所です。つまり、格納されたデータはデータのキーとも呼ばれます。

マップコンテナ

マップ クラス テンプレートを作成するための構文は次のとおりです。

std::map<key,type,predicate> name;

このメソッドは、タイプ type のデータを含む name という名前の空のマップ オブジェクトを作成します。このオブジェクトは、述語で指定された関数を使用して、コレクション内の要素を順序付けします。たとえば、整数用の空のマップ オブジェクトを作成するには、次のように記述します。

std::map<int,int,std::less<int>> intmap;

 マップ<キー、タイプ、述語> 名前(mymap);

//このメソッドはコピー コンストラクターを使用して、既存のマップ mymap からマップ オブジェクトを生成します。

map<key,type,predicate> name(first,last);

//このメソッドは、複数のポインターによって示される開始位置と終了位置に基づいて、要素の範囲からマップを作成します。

マップ クラス テンプレートのメソッドの説明を次の表に示します。


関数 説明する
始める コレクション内の最初の要素を指す反復子を返します。
終わり コレクション内の最後の要素を指すイテレータを返します。
クリア セット内のすべての要素を削除します
コレクションが空かどうかを判断し、空の場合は true を返します。
等しい範囲(x) x の下限と上限を表す 2 つの反復子を返します。下限は、x に等しい値を持つコレクション内の最初の要素を表し、上限は、x より大きい値を持つ最初の要素を表します。
消去(i) イテレータが指すコレクション要素を削除するか、キー値によってコレクション要素を削除します
消去(x) 値 x を持つ要素をセットから削除します
見つける(x) x を指す反復子を返します。x が存在しない場合、返される反復子は end と等しくなります。
下限(x) x の前およびすぐ隣の要素を指す反復子を返します。
max_size コレクションの最大のコンテナを返します
始める コレクションの最後の要素を指す逆反復子を返します。
引き裂く コレクションの最初の要素を指す逆反復子を返します。
サイズ コレクションのサイズを返します
スワップ() 2 つのコレクションの内容を交換します
上限(x) xを指すコンテナを返します
値の補償 value_compare タイプのオブジェクトを返します。これは、コレクション内の要素の順序を決定するために使用されます。

たとえば、マップ オブジェクトを作成し、挿入を使用して新しい要素を追加します。

#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<int,char> imap;    //创建map映射对象
	imap.insert(map<int,char>::value_type(1,'c'));    //插入新元素(与之前的插入有所不同)
	imap.insert(map<int,char>::value_type(4,'a'));
	imap.insert(map<int,char>::value_type(3,'d'));
	imap.insert(map<int,char>::value_type(15,'f'));
	map<int,char>::iterator it;
	for(it=imap.begin();it!=imap.end();it++)        //循环map映射显示元素值
	{    
		cout<<(*it).first<<"->";
		cout<<(*it).second<<endl;
	}
	return 0;	
} 

 操作の結果は次のようになります。

実行結果から、コンテナはデータ自体ではなく前の取得コードによってソートされていることがわかります。また、このタイプのテンプレートの挿入および走査出力は、最初のテンプレートを表すために it.first を使用しているため、前のテンプレートとは異なります。検索コードの it.second は 2 番目のデータを表し、挿入には imap.insert(map<int,char>::value_type()) を使用しますが、異なるのは value_type データが使用されることです。

これら 2 つのクラス テンプレートは、他のクラス テンプレートの操作とは異なる方法で文字列データを格納することに注意してください。具体的な操作は次のとおりです。

#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<double,string> mm;
	mm.insert(pair<double,string>(5.24,string("李牧歌")));    //用pair的格式插入数据
	mm.insert(make_pair(3.21,string("侯伊美")));        //使用make_pair存储数据
	mm.insert(make_pair(10.9,string("王润怡")));
	mm.insert(make_pair(9.21,string("王俐元")));
	map<double,string>::iterator it=mm.begin();
	cout<<"mm:"<<endl;
	while(it!=mm.end())
	{
		cout<<"生日"<<it->first<<endl;
		cout<<"姓名"<<it->second<<endl;
		cout<<endl; 
		*it++;	
	}	
	return 0;	
} 

具体的な走行結果は以下の通りです(年齢もソートしています)。

 具体的には、文字列データの挿入にはmake_pairとpairの2つの形式がありますが、最初の方法の方が操作しやすいと思います。mm[1.5]=string("hym) を配列の形式で直接割り当てることもできます。ここでの割り当ては他のクラス テンプレートの割り当てとは異なるため、特に注意する必要があります。

マルチマップコンテナ


        マルチマップは一連の値を連続して保存できます。各要素にキー値と関連するデータ項目を含めることができるという点ではマップと同じです。マップとは異なり、マルチマップには繰り返しデータを含めることができますが、値を割り当てる [ ] 演算子は使用できません複数の要素に。

マルチマップ クラス テンプレートを構築するステートメントは次のとおりです。

std::multimap<key,type,predicate> name;

        このメソッドは、type のデータ型を含む name という名前の空のマルチマップ オブジェクトを作成します。このオブジェクトは、述語で指定された関数を使用して、コレクション内の要素を順序付けします。たとえば、整数用の空のマルチマップ オブジェクトを作成するには、次のように記述できます。

std::multimap<int,int,std::less<int> > intmap;
//注意《int》后需要敲一个空格

multimap<key,type,predicate> name(mymap);

//このメソッドはコピー コンストラクターを使用して、既存のマップ mymap からマルチマップ オブジェクトを生成します。

multimap<key,type,predicate> name(first,last);

//このメソッドは、複数のポインターによって示される開始位置と終了位置に基づいて、要素の範囲からマップを作成します。

マップ クラス テンプレートとの最大の違いは、次のコードに示すように、[] を使用してコレクション内の要素に値を割り当てることができないことと、そのデータ項目が繰り返し現れる可能性があることです。

#include<iostream>
#include<map>
using namespace std;
int main()
{
	multimap<double,char> Cmap;
	Cmap.insert(make_pair(1,'c'));
	Cmap.insert(make_pair(4,'c'));
	Cmap.insert(make_pair(2,'b'));
	Cmap.insert(make_pair(6,'r'));
	Cmap.insert(make_pair(13,'a'));
	cout<<"Cmap :"<<endl;
	map<double,char>::iterator it=Cmap.begin();
	while(it!=Cmap.end())
	{
		cout<<" "<<it->first;
		cout<<" "<<it->second<<endl;
		cout<<endl; 
		*it++;	
	}	
	return 0;	
} 

また、pair メソッドを使用して値を代入することもできますし、map<int,cahr>::value_type() を使用して代入演算を実行することもできます。便利で簡単な代入演算があれば、このマルチマップの場合、クラス テンプレートでの使用方法はマップ クラス テンプレートの使用方法とまったく同じであるため、ここでは使用方法の図は省略し、マップとの違いを区別するだけで済みます。クラステンプレート。

        このブログはこれで終わりです。水曜日にブログを更新すると約束していましたが、水曜日は学校の行事や大会に参加したため、水曜日はとても忙しくてブログの更新ができませんでした。今日の授業は少し少なめです。ブログを書いた後は、STL 標準テンプレート ライブラリに関するこれらのブログを読んで、STL 標準テンプレート ライブラリについてある程度の理解を深め、興味があれば自分でコードを考えてみてください。やるよりも頭を使うほうが良いのです。次回のブログでは、STL テンプレート ライブラリのより重要なモジュール アルゴリズムについて説明する予定です。続報に注目してください (とにかく、今回はブログを更新するという約束はしません。最も重要なことは、ブログを更新することです)ブログを更新するたびに、今まで気づかなかった小さな知識を知ることができます(勉強するときはあまり丁寧に学ばなかったかもしれませんがははは)想像しないでください。プログラムはあなたの想像に従って実行されるかもしれません。それはまったく異なります。

おすすめ

転載: blog.csdn.net/m0_61886762/article/details/124158923