1. 程式人生 > >STL Map學習總結

STL Map學習總結

1、 Map是關聯容器,以鍵值對的形式進行儲存,方便進行查詢,關鍵詞起到索引的作用,值則表示與索引相關聯的資料,以紅黑樹的結構實現,插入刪除等操作都可以在O(log n)時間內完成

2、它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。

//map關聯容器
//提供一對一的關係,一個map項包括兩個資料段key-value
//key:關鍵字,一個key只能在map中出現一次(重複出現則覆蓋)
//map會根據鍵值自動排序
//map.find(key)
//map.count(key)計算key出現1次
//multimap.count(key) 可出現多次
//multimap.lower_bound(key) 第一個大於等於key的元素,這個函式用來返回要查詢關鍵字的下界(是一個迭代器)
//multimap.upper_bound(key) 第一個大於key的元素,這個函式用來返回要查詢關鍵字的上界(是一個迭代器)
//equal_range()函式返回一個pair,
	//pair裡面第一個變數是Lower_bound返回的迭代器,pair裡面第二個迭代器是Upper_bound返回的迭代器,
	//如果這兩個迭代器相等的話,則說明map中不出現這個關鍵字
//multimap可以有一對多的關係,沒有[]操作
//二叉樹:一個結點最多有兩個子結點
//平衡二叉樹:左樹和右樹的高度絕對值不超過1
//1、使用map需包含map類所在的標頭檔案:#include <map> //注意,STL標頭檔案沒有副檔名.h
#include<iostream>
#include<string>
#include<map>

using namespace std;
int main()
{
	//2、map的定義
	map<int, string> map1;
	//3、map四種插入方法
	map1.insert(map<int,string>::value_type(10,"aaaa"));
	map1.insert(pair<int, string>(20, "bbbb"));
	map1.insert(make_pair(30, "cccc"));
	map1[40] = "dddd";
	map1[40] = "eeee";  //覆蓋dddd
	for (int i = 10; i < 50; i += 10)
	{
		cout << map1[i]<< endl;
	}
	//4、迭代輸出。若為rbegin()和rend()為反向迭代
	for (map<int, string> ::iterator it = map1.begin(); it != map1.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	cout << map1.size()<<endl;
	//5、利用find(key)和count(key)來發現一個鍵是否存在
	//map1.find(key)  返回一個迭代器指向鍵值為key的元素,如果沒有找到,返回指向map尾部的迭代器
	//cout << map1.count(40) << endl;
	map<int, string> ::iterator find_it = map1.find(40);
	cout << find_it->first << ":" << find_it->second << endl;
	//6、元素刪除:先查詢元素,map<int ,string>::iterator it=map1.find(key); 找到之後map1.erase(it);
	//erase() 的返回值為0或者1.若為1表示刪除成功,否則刪除失敗
	map<int, string> ::iterator del_it = map1.find(10);
	map1.erase(del_it);
	//7、map中的swap函式,交換的是兩個容器而不是一個容器中的元素交換
	map<int, int> m1, m2,m3;
	m1.insert(pair<int, int>(1, 1));
	m1.insert(pair<int, int>(2, 2));
	m1.insert(pair<int, int>(3, 3));
	m2.insert(pair<int, int>(11, 11));
	m2.insert(pair<int, int>(12, 12));
	m2.insert(pair<int, int>(13, 13));
	m3.insert(pair<int, int>(21, 21));
	m3.insert(pair<int, int>(22, 22));
	m3.insert(pair<int, int>(23, 23));
	cout << "m1:" << endl;
	for (map<int, int> ::iterator it = m1.begin(); it != m1.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	cout << "m2:" << endl;
	for (map<int, int> ::iterator it = m2.begin(); it != m2.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	cout << "m3:" << endl;
	for (map<int, int> ::iterator it = m3.begin(); it != m3.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	cout << "-----m1.swap(m2)測試-------" << endl;
	m1.swap(m2); //深拷貝。用m1.swap(m2)無法換回來
	cout << "m1:" << endl;
	for (map<int, int> ::iterator it = m1.begin(); it != m1.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	cout << "m2:" << endl;
	for (map<int, int> ::iterator it = m2.begin(); it != m2.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	
	cout << "-----swap(m3, m1);測試-------" << endl;
	swap(m1, m3);
	cout << "m1:" << endl;
	for (map<int, int> ::iterator it = m1.begin(); it != m1.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	cout << "m3:" << endl;
	for (map<int, int> ::iterator it = m3.begin(); it != m3.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}
	//8、sort函式,因為map中key按照升序進行排列的,所以不能使用sort函式
	//9、資料的清空與判空清空map中的資料可以用clear()函式,
	//10、判定map中是否有資料可以用empty()函式,它返回true則說明是空map
	/*map<string, string> map2;
	map2["張三"] = "小三";
	map2["李四"] = "小四";
	cout << map2["張三"] << endl;*/
	cout << "-----------------------multimap分割線-----------------------" << endl;
	multimap<int, string> multimap1;	
	multimap1.insert(make_pair(20, "BBB"));
	multimap1.insert(make_pair(30, "CCC"));
	multimap1.insert(make_pair(50, "EEE"));
	multimap1.insert(make_pair(50, "FFF"));
	multimap1.insert(make_pair(50, "GGG"));
	multimap1.insert(make_pair(50, "HHH"));
	multimap1.insert(make_pair(40, "DDD"));
	multimap1.insert(make_pair(10, "AAA"));

	cout << "multimap1元素為:" << endl;
	for (multimap<int, string> ::iterator it = multimap1.begin(); it != multimap1.end(); it++)
	{
		cout << it->first << ":" << it->second << endl;
	}

	cout << multimap1.count(50) << endl;
	multimap<int, string>::iterator it1 = multimap1.find(50);
	int count =multimap1.count(50);
	cout << "count測試" << endl;
	for (int i = 0; i < count; i++)
	{
		cout << it1->first << ":" << it1->second << endl;
		it1++;
	}
	multimap<int, string> ::iterator it;
	multimap<int, string>::iterator begin, end;
	cout << "lower_bound.upper_bound測試" << endl;
	begin = multimap1.lower_bound(50);
	end = multimap1.upper_bound(50);
	
	for (it = begin; it != end; ++it)
	{
		cout << it->first << ":" << it->second << endl;
		it++;
	}
	cout << "equal_range測試" << endl;
	auto pairTemp=multimap1.equal_range(50);
	begin = pairTemp.first;
	end = pairTemp.second;
	for (it = begin; it != end; ++it)
	{
		cout << it->first << ":" << it->second << endl;
		it++;
	}
	return 0;
}

執行結果: