map(究極の奥義)

5512 ワード

MapはSTLの関連コンテナで、1対1(最初はキーワードと呼ぶことができ、各キーワードはmapに1回しか現れず、2番目はキーワードの値と呼ぶことができる)のデータ処理能力を提供します.この特性のため、1対1のデータを処理するときにプログラミングに高速チャネルを提供する可能性があります.数学的マッピングは、1つの値が別の集合に対応する唯一の値であり、2つ以上は使用できませんが、同じ集合の中に異なる要素が別の集合に対応する同じ要素があり、これは許可されます.
次はmapの基本的な使い方を話します:復習に使いましょう
mapコンテナはデフォルトのインクリメントシーケンスであり、インクリメントに変更する場合はmap  >mp;   インクリメントはmap>mpを加えることもできます.その中の英語の単語の意味とは反対です.
1.MAPデータの挿入には3つの方法があります.そのうち2つはもう1つとは違います.2つは、mapに同じ要素があれば、もう挿入しません.3つ目は彼のマッピングを上書きします
1つ目と2つ目:
using namespace std;
#include
map>mp;
mp.insert(make_pair(5,5));
mp.insert(make_pair(100,1000));
#include
map>mp;
mp.insert(pair(10,10)); 
mp.insert(pair(20,20));

3つ目は、配列の割り当て操作に似ています.
#include
map>mp;
mp[1]=5;
mp[2]=100;
mp[0]=12;

3つ目の方法:カッコの中にあるのは下付きではなくkey値で、後ろの値はこの値に対応するマッピングです.
 2.map要素の遍歴、順方向遍歴と逆方向遍歴出力:
フォワードパス:
for(auto it=mp.begin();it!=mp.end();it++)
	cout<first<second<

逆ループ:
 
cout<first<second<
it1=mp.begin();
	while(it1!=mp.end())
	{
		cout<first<second<

 
これは配列形式の出力ですが、最初のキーが連続する価値があることが要求されます.
#include
map>mp;
int main()
{
	int i;
	mp[1]=2;
	mp[2]=3;
	mp[3]=4;
	for(i=1;i<=mp.size();i++)
		{
			cout<

また、反復器を1回使用した後、最初の要素の反復器を戻す必要があります.
3.データの削除、検索(見つかったときにその要素の反復器を返します.そうでなければ、末尾の反復器を返します)、および要素にcountがあるかどうかを判断します.戻り1がある場合、戻り0はありません.次の操作を行います.
以下の検索操作はいずれもキーの検索であり,対応する値の検索ではない点で誤りやすい.
#include
#include
#include
#include
using namespace std;
#include
map>mp;
int main()
{
	//      
	mp[1]=5;
	mp[2]=100;
	mp[0]=12;
	//              ,       mp.begin()  
	//           
	cout<first<second<(10,10)); 
	mp.insert(pair(20,20));
	
	//           
	cout<first<second<::iterator it1=mp.begin();
	map::iterator it5;
	
	//    
	cout<first<second<first<first<second<

検索する値より大きい値または等しい値をlower_で検索boundの最初の値がこの値より大きいupper_bound   彼らが戻ってきたのはすべて反復器です.調べる前にインクリメンタルシーケンスが必要です.キーの検索でもあり、値の検索ではありません. 
コード実装を見てみましょう.
it1=mp.begin();
	it1=mp.lower_bound(2);
	if(it1->first==2)       //                      
	{						//               ,      
		cout<first<second<

これはあのit 1=find(x)とは少し違いますが、it 1が見つかったら、it 1反復器は尾要素の反復器ではありません.最後の要素の反復器を指す場合は、見つかりません.
コード実装:
it1=mp.find(1000);
	if(it1!=mp.end())   //                                   
	{					 
		cout<first<second<

 
重要な知識点:
1.mapはマッピングである以上、左キー値に基づいて右値を見つけることができ、一種の検索と言えるでしょう(ただし、テーマデータ量が多く、mapで検索するとタイムアウトし、この場合mapの代わりに配列を使うことができます)、一部のデータ検索では、この方法(情報と情報のマッチング)が用いられます.
もちろんここのmap aとbのデータ型は  int,int  ;            string,int ;           string,string;         int ,string;などなど.
2.mapは実は1つの1つのキー値のペアで、キーは繰り返してはいけませんが、値は繰り返してもいいです.関数の1つの引数のように、2つ以上のy値がxに対応することはできません.例えば、1は2に対応して、2は2に対応していますが、1は他の値に対応できません.
3.mapで情報をマッチングし、第3の方法で情報を挿入し、mp[xx]=yy;  このように情報xxと情報yyの間に何らかの関係が確立され,直接mp[xx]  このyyを見つけに来ましたが、逆に探すことはできません.    
次はmapのソートに関する知識です.
https://blog.csdn.net/chengqiuming/article/details/89816566  これはいくつかの大神のブログで、はっきり書いています.
key        ,               
    struct node
	{
		string name;
		int score;
		node(string name1,int now)
		{
			name=name1,score=now;
		}
		bool operatora.score;
			return name p;
	maps;


     key            ,       cmp       。
	maps;
	struct cmp
	{
		//  key     ,   value  ,     
		bool operator()(const string& a,const string& b)
		{
			return a>b;   //         ,     
		}
	};

次にvalue/keyをソートし、他のコンテナを使用して操作します:(カスタム関数に基づいてソートルールを書くことができます)
#include
#include

using namespace std;
typedef pair p;

bool cmp(p a,p b)
{
	if(a.second!=b.second)
		return a.second>b.second;
	else
		return a.firstmp;
	mp[1]=3;
	mp[5]=1;
	mp[999]=111;
	mp[12]=111;
	
	vector

s(mp.begin(),mp.end()); sort(s.begin(),s.end(),cmp); for(int i=0;i


 2つのmapが一緒に使用される場合(二重対応で問題を解決できる場合がある)、mapセットmapを採用すると、方法が少し異なります.
#include
#include
#include
#include

using namespace std;
typedef pair p;

int main()
{
	map>s;
	s[1][2] = 3;
	s[2][2] = 15;
	for (auto it1 = s.begin(); it1 != s.end(); it1++)
	{
		cout << it1->first << ' ';
		maps2 = it1->second;
		for (auto it2 = s2.begin(); it2 != s2.end(); it2++)
			cout << it2->first << ' ' << it2->second << endl;

	}
	return 0;
}

これで3つの要素の対応関係を組み込むことができ、問題を解決することができます.