1. 程式人生 > >stl之map容器的原理及應用

stl之map容器的原理及應用

        容器的資料結構同樣是採用紅黑樹進行管理,插入的元素健位不允許重複,所使用的節點元素的比較函式,只對元素的健值進行比較,元素的各項資料可通過健值檢索出來。map容器是一種關聯容器,實現了SortedAssociative Container、Sorted Associative Container和Unique Associative Container概念的介面規範。

map技術原理

圖中所示是map容器的一個元素的資料組成,可通過pair封裝成一個結構物件。map容器所要做的,就是將這個pair物件插入到紅黑樹,完成一個元素的新增。同時,也要提供一個僅使用鍵值進行比較的函式物件,將它傳遞給紅黑樹。由此,就可利用紅黑樹的操作,將

map元素資料插入到二叉樹中的正確位置,也可以根據鍵值進行元素的刪除和檢索。


map應用基礎

標頭檔案:#include<map>

建立map物件

1)map(); //建立一個沒有任何元素的map物件

2)map(constkey_compare& comp); //指定一個比較函式物件comp來建立map物件,記憶體分配器為預設值。

3)map(constmap&); //拷貝建構函式,用一個map容器的元素和比較函式,拷貝生成一個新的map容器物件。

4)map(InputIteratorfirst, InputIterator last); //用迭代器區間[first)

所指的資料,作為map容器的元素(包括鍵值和映照資料),建立一個map容器物件。

#include <iostream>
#include <map>
using namespace std;
struct classcomp {
	bool operator() (const char& lhs, const char& rhs) const
	{return lhs<rhs;}
};
int main ()
{
	//建立map物件
	map<char,int> first;
	map<char,int,classcomp> fourth;   
	map<char,int> third (second);
	map<char,int> second (first.begin(),first.end());            
	return 0;
}

元素的插入

除可使用如下的insert函式,將整個元素資料進行插入外,常用map容器的陣列操作"[]",顯式地為不同鍵值賦予內容(映照資料),不過這個陣列方法,不能檢測是否插入成功。

1)pair<iterator,bool>insert(const value_type& v)

將元素v(包括鍵值和映照資料)插入map容器,重複的v值不被插入。返回一個pair配對物件,提供所插入元素的迭代器位置和true/false插入成功標誌。

2)iteratorinsert(iterator position, const value type& v)

將元素v(包括鍵值和映照資料)插入map容器,引數position只是提示可在position位置之前插入v,所返回的插入位置視情況而定,不一定在position位置前插入。

3voidinsert(InputIterator first, InputIterator last)

將迭代器區間[first,last)所指的資料作為容器元素(包括鍵值和映照資料),插入到map容器中。

//"[]"
map<char,std::string> mymap;
mymap['a']="an element";
mymap['b']="another element";
mymap['c']=mymap['b'];
// map::insert
#include <iostream>
#include <map>
using namespace std;
int main ()
{
	map<char,int> mymap;
	//insert函式版本
	mymap.insert ( pair<char,int>('a',100) );
	mymap.insert ( pair<char,int>('b',200) );

	pair<map<char,int>::iterator,bool> ret;
	ret = mymap.insert ( std::pair<char,int>('b',500) );
	if (ret.second==false) {
		cout << "元素'b' 已經存在";
		cout << " 其值為" << ret.first->second << '\n';
	}
	// insert函式版本
	map<char,int>::iterator it = mymap.begin();
	mymap.insert (it, pair<char,int>('b',300));  // 最高效的插入
	mymap.insert (it, std::pair<char,int>('c',400));  //非最高效的插入
	//insert函式版本
	map<char,int> anothermap;
	anothermap.insert(mymap.begin(),mymap.find('c'));
	//輸出容器:
	cout << "mymap 包含:\n";
	for (it=mymap.begin(); it!=mymap.end(); ++it)
		cout << it->first << " => " << it->second << '\n';
	cout << "anothermap 包含:\n";
	for (it=anothermap.begin(); it!=anothermap.end(); ++it)
		cout << it->first << " => " << it->second << '\n';
	system("pause");
	return 0;
}

元素的刪除

1. void erase(iteratorposition); 刪除position所指的元素
2. size_type erase(const key_type& k);  
刪除等於鍵值k的那個元素,對於map容器來說,此函式總是返回值1,因為map容器不會出現重複的元素值(鍵值)
3. void erase(iterator first, iterator last); 
刪除map迭代器區間[first,last)上的所有元素
4. void clear(); 
刪除map容器的所有元素

#include <iostream>
#include <map>
using namespace std;
int main ()
{
	map<char,int> mymap;
	map<char,int>::iterator it;
	// 插入一些元素:
	mymap['a']=10;
	mymap['b']=20;
	mymap['c']=30;
	mymap['d']=40;
	mymap['e']=50;
	mymap['f']=60;
	it=mymap.find('b');
	mymap.erase (it);                   // 刪除迭代器所指元素
	mymap.erase ('c');                  //刪除鍵值為'c'的元素
	it=mymap.find ('e');
	mymap.erase ( it, mymap.end() );    //刪除區間內的元素
	for (it=mymap.begin(); it!=mymap.end(); ++it)
		cout << it->first << " => " << it->second << '\n';
	return 0;
}

其他成員函式用法與前篇set容器相似,不再贅述。

直觀來說,map容器區別於set容器的一個主要特性在於,map是處理帶有鍵值的記錄型元素資料的快速插入、刪除和檢索,而set則可看成是對單一資料的處理。map將一個元素劃分出鍵值部分,並按這個區域性的鍵值制定整個元素的函式比較規則,來建立容器的資料分佈。map的元素鍵值是唯一的,不允許重複的元素鍵值插入。set和map都是泛型庫對二叉樹的一個泛化。

轉載請註明出處:http://blog.csdn.net/lsh_2013/article/details/46762505,謝謝合作!