map是STL中基于紅黑樹的一種資料結構,該結構的元素是pair<key,value>,其中key是元素的鍵值,搜尋時使用,value是元素的實值,是這棵樹中真正要儲存的東西。map的函數基本是基于底層的紅黑樹的,也有一些是自有函數,比如subscript操作符,即“[ ]”。
作出以下函數驗證subscript操作符:
map<string,int> imap;
pair<string,int> tmp("A",1);
imap.insert(tmp);
imap[string("B")]=2;//當“[ ]”傳回的元素作為左值運用時,如果沒有‘B’,則在紅黑樹中插入這個節點,如果有‘B’,則傳回指向這個節點的疊代器。
int second=imp[string("C")];
map<string,int>::iterator imapIter=imap.begin();
while(imapIter!=imap.end())
{
cout<<(*imapIter).first<<" "<<(*imapIter).second<<endl;
imapIter++;
}
以上程式的結果是:
A 1
B 2
C 0
程式表明subscirpt操作符不單單是個提領的過程,它裡面隐含着插入操作,考察map中subscript源碼:
template<class T>
public:
T& operator[] (const key_type &k)
{
return (*((insert(value_type(k,T()))).first)).second
}
是以,使用map中的下标操作符要注意了,裡面是隐含有插入的,不分左值情況和右值情況。