小心使用STL中map的[]操作符
生活随笔
收集整理的這篇文章主要介紹了
小心使用STL中map的[]操作符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個map就是一個(關鍵碼(key),值(value))對偶的序列,它提供基于關鍵碼的快速提取操作。也就是說,可以用下標運算符[]將關鍵碼作為下標去執行查找,并返回對應的值。因此可以把map的使用方法想象成有特殊下標的數組。在很多時候用下標運算符[]來對map中的元素進行存取是非常方便和簡單的;但是,如果map下標運算符[]運用不得當,也會造成意想不到的問題。
我們知道,C++是不檢查下標越界的。用超出數組下標范圍的下標去訪問數組元素的錯誤會在運行期出現,很有可能將程序搞崩潰。對于map而言,也沒有類似的下標越界概念,但是卻有作為下標的關鍵碼(key)在map中不存在的現象。在這種情況下,如果運用不得當,就造成意想不到的問題,而且這種問題是屬于比較隱蔽的問題。如果對map的下標運算符[]不是非常了解,將很難發現問題所在。
比如說有下面的代碼片斷:
// 定義一個map map<string, string> mapTelDir;
// 用[]操作符可以方便快速的給map添加內容 mapTelDir["StarLee"] = "13813131313";
// ...
// 修改關鍵碼為LiXing的值 // 注意,這里的關鍵碼在map里面并不存在 if (mapTelDir["LiXing"] == "13913131313") { mapTelDir["LiXing"] = "13513131313"; }
// ...
// 輸出 cout << "The cellhone number of LiXing is: " << mapTelDir["LiXing"] << endl; 上面的代碼看起來似乎沒有任何問題,但是,最后一行的輸出的手機號碼卻永遠為空!原因就是在判斷語句里面對map的下標運算符[]的錯誤使用。 map的下標運算符[]的作用是:將關鍵碼作為下標去執行查找,并返回對應的值;如果不存在這個關鍵碼,就將一個具有該關鍵碼和值類型的默認值的項插入這個map。 對于上面的代碼來說,if (mapTelDir["LiXing"] == "13913131313")這行代碼首先去查詢map中是否有關鍵碼為LiXing的項,結果發現沒有該項,于是就向map中插入了一項<"LiXing", "">(sting的默認值為空字符串)。這就造成if語句的判斷結果永遠為false,那樣就不可能修改修改關鍵碼為LiXing的值。 為了更好的說明這個問題,可以看一下map下標運算符[]的實現代碼:
// 下面的代碼摘自VS2005中的..vcincludemap mapped_type& operator[](const key_type& _Keyval) { ? ?// find element matching _Keyval or insert with default mapped iterator _Where = this->lower_bound(_Keyval); if (_Where == this->end() || this->comp(_Keyval, this->_Key(_Where._Mynode()))) _Where = this->insert(_Where, value_type(_Keyval, mapped_type())); return ((*_Where).second); } map的下標操作符[]使用上面的方法定義,使向map里插入值和使用關鍵碼來訪問相應的值變得非常方便而快速。雖然在使用的時候會出現有人寫出類似上面那樣的錯誤代碼,但是這是程序員的錯誤,因為寫出正確的代碼是程序員的責任。這樣做很符合C++的風格:非常靈活,但是要小心使用。
// 定義一個map map<string, string> mapTelDir;
// 用[]操作符可以方便快速的給map添加內容 mapTelDir["StarLee"] = "13813131313";
// ...
// 修改關鍵碼為LiXing的值 // 注意,這里的關鍵碼在map里面并不存在 if (mapTelDir["LiXing"] == "13913131313") { mapTelDir["LiXing"] = "13513131313"; }
// ...
// 輸出 cout << "The cellhone number of LiXing is: " << mapTelDir["LiXing"] << endl; 上面的代碼看起來似乎沒有任何問題,但是,最后一行的輸出的手機號碼卻永遠為空!原因就是在判斷語句里面對map的下標運算符[]的錯誤使用。 map的下標運算符[]的作用是:將關鍵碼作為下標去執行查找,并返回對應的值;如果不存在這個關鍵碼,就將一個具有該關鍵碼和值類型的默認值的項插入這個map。 對于上面的代碼來說,if (mapTelDir["LiXing"] == "13913131313")這行代碼首先去查詢map中是否有關鍵碼為LiXing的項,結果發現沒有該項,于是就向map中插入了一項<"LiXing", "">(sting的默認值為空字符串)。這就造成if語句的判斷結果永遠為false,那樣就不可能修改修改關鍵碼為LiXing的值。 為了更好的說明這個問題,可以看一下map下標運算符[]的實現代碼:
// 下面的代碼摘自VS2005中的..vcincludemap mapped_type& operator[](const key_type& _Keyval) { ? ?// find element matching _Keyval or insert with default mapped iterator _Where = this->lower_bound(_Keyval); if (_Where == this->end() || this->comp(_Keyval, this->_Key(_Where._Mynode()))) _Where = this->insert(_Where, value_type(_Keyval, mapped_type())); return ((*_Where).second); } map的下標操作符[]使用上面的方法定義,使向map里插入值和使用關鍵碼來訪問相應的值變得非常方便而快速。雖然在使用的時候會出現有人寫出類似上面那樣的錯誤代碼,但是這是程序員的錯誤,因為寫出正確的代碼是程序員的責任。這樣做很符合C++的風格:非常靈活,但是要小心使用。
總結
以上是生活随笔為你收集整理的小心使用STL中map的[]操作符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习vi和vim编辑器(8):全局替换(
- 下一篇: redhat/centos 搭建svn服