天天看點

C++标準庫---map&multimap

使用map和multimap需要注意以下幾點:

1.map和multimap将key/value(鍵值/實值 對組)當做元素,進行管理。它們可根據key的排序準則自動将元素元素排序。multimap允許重複元素,map不允許。

2.map的第一個參數被當做元素的key,第二個參數被當做元素的value,第三個參數用它來定義排序準則。元素的次序由它們的key決定,和value無關。

3.map和multimap根據元素的key自動對元素進行排序,這麼一來,根據已知的key搜尋某個元素時,就能夠有很好的性能,而根據已知value搜尋元素時,性能就很糟糕。

4.“自動排序”這一性質使得map和multimap身上有了一條重要的限制:不可以直接改變元素的key,因為這會破壞正确次序。要修改元素的key,必須先移除擁有該key的元素,

然後插入擁有新的key/value的元素。從疊代器的角度來看,元素的key是常數,至于元素的value倒是可以直接修改。

5.map和multimap不支援元素直接存取,是以元素的存取通常是經由疊代器進行。不過map有個例外,map提供下标操作符,可直接存取元素。

6.在map和multimap中,key被視為常數,是以不能調用任何變動性算法,例如你不能對它們調用remove(),因為remove()算法實際上是以一個參數值覆寫被移除的元素。如果要移除map和multimap的元素,你隻能使用它們所提供的成員函數。

7.将map視為關聯式數組:

關聯式容器并不提供元素的直接存取,你必須依靠疊代器,map是個例外。Non-const map提供下标操作符,支援下标操作符。支援元素的直接存取,不過下标操作符的索引值并非元素整數位置,而是元素的key,也就是說索引可以是任意型别,而非局限為整數型别。

8.map和一般數組之間的差別不僅僅在于索引型别,其他的差別包括:

如果你使用某個key作為索引,而容器之中尚未存在對應元素,那麼就會自動安插該元素,新元素的value由default構造函數構造。

優點是:你可以透過更友善的接口對着map安插新元素。

缺點是:你可能不小心誤置新元素。

代碼示例:

//map修改key&value
#include<iostream>
#include<map>
#include<algorithm>
#include<string>

using namespace std;

int main()
{
	typedef map<string,float> StringFloatMap;

	StringFloatMap stocks;

	stocks["BASF"]=369.50;
	stocks["VW"]=413.50;
	stocks["Daimler"]=819.00;
	stocks["BMW"]=834.00;
	stocks["Siemens"]=842.20;

	StringFloatMap::iterator pos;
	for(pos=stocks.begin();pos!=stocks.end();++pos)
	{
		cout<<"stock: "<<pos->first<<"\t"
			<<"price: "<<pos->second<<endl;
	}
	cout<<endl;

	for(pos=stocks.begin();pos!=stocks.end();++pos)
	{
		pos->second*=2;//修改value
	}

	for(pos=stocks.begin();pos!=stocks.end();++pos)
	{
		cout<<"stock: "<<pos->first<<"\t"
			<<"price: "<<pos->second<<endl;
	}
	cout<<endl;

	stocks["Volkswagen"]=stocks["VW"];//修改key
	stocks.erase("VW");//删除原來的

	for(pos=stocks.begin();pos!=stocks.end();++pos)
	{
		cout<<"stock: "<<pos->first<<"\t"
			<<"price: "<<pos->second<<endl;
	}
	cout<<endl;

	system("pause");
	return 0;
}
           

運作結果:

C++标準庫---map&amp;multimap
//查找
#include<iostream>
#include<map>
#include<algorithm>
#include<string>
#include<iomanip>

using namespace std;

void print()
{
	cout.setf(ios::left,ios::adjustfield);
	cout<<" "<<setw(10)<<"english "<<"german "<<endl;
	cout<<setfill('-')<<setw(20)<<""<<setfill(' ')<<endl;
}

int main()
{
	typedef multimap<string,string> StrStrMap;

	StrStrMap dict;

	dict.insert(make_pair("day","Tag"));
	dict.insert(make_pair("strange","fremd"));
	dict.insert(make_pair("smart","elegant"));
	dict.insert(make_pair("trait","Merkmal"));
	dict.insert(make_pair("car","Auto"));
	dict.insert(make_pair("strange","seltsam"));
	dict.insert(make_pair("smart","raffiniert"));
	dict.insert(make_pair("smart","klug"));
	dict.insert(make_pair("clever","raffiniert"));

	StrStrMap::iterator pos;

	print();
	for(pos=dict.begin();pos!=dict.end();++pos)
	{
		cout<<" "<<setw(10)<<pos->first<<pos->second<<endl;
	}
	cout<<endl;

	string word("smart");
	cout<<word<<": "<<endl;
	for(pos=dict.lower_bound(word);pos!=dict.upper_bound(word);++pos)//查找key
	{
		cout<<"      "<<pos->second<<endl;
	}

	word="raffiniert";
	cout<<word<<": "<<endl;
	for(pos=dict.begin();pos!=dict.end();++pos)
	{
		if(pos->second==word)//查找value
		{
			cout<<"      "<<pos->first<<endl;
		}
	}
	cout<<endl;

	word="day";
	pos=dict.find(word);//key
	if(pos!=dict.end())
	{
		dict.erase(pos);//删除key
	}

	print();
	for(pos=dict.begin();pos!=dict.end();++pos)
	{
		cout<<" "<<setw(10)<<pos->first<<pos->second<<endl;
	}
	cout<<endl;

	word="raffiniert";
	for(pos=dict.begin();pos!=dict.end();)
	{
		if(pos->second==word)
		{
			dict.erase(pos++);
		}
		else
		{
			++pos;
		}
	}
	
	print();
	for(pos=dict.begin();pos!=dict.end();++pos)
	{
		cout<<" "<<setw(10)<<pos->first<<pos->second<<endl;
	}
	cout<<endl;

	system("pause");
	return 0;
}
           

運作結果(查找部分):

C++标準庫---map&amp;multimap

運作結果(删除部分):

C++标準庫---map&amp;multimap

繼續閱讀