C STL map 下標操作注意事項

2021-06-29 12:44:34 字數 1556 閱讀 8273

今天的程式出了乙個bug,查到的原因是使用map下標操作的問題,在這裡轉乙個作為備忘

乙個map就是乙個key、value對偶的序列,它提供基於key的快速提取操作。也就是說,可以用下標運算子將key作為下標去執行查詢並返回相應的值。因此可以把map的使用方法想象成有特殊下標的陣列。在很多時候用下標運算子對map中的元素進行訪問是非常方便和簡單;但是如果map下標運算子運用不得當,也會造成意想不到的問題。

我們知道,c++是吧檢查下標越界的。用超出陣列下標範圍的下標去訪問陣列元素的錯誤會在執行期出現,很有可能將程式搞崩潰。對於map而言,也沒有類似的下標越界概念,但是卻又作為下標的key在map中不存在的現象。在這種情況下,如果運用不當,就造成意想不到的問題,而這種問題是屬於比較隱蔽的問題。如果對map的下標運算子不是非常了解,將很難發生問題所在。

比如說有下面的**片段:

//定義乙個map

mapmapteldir;

//用操作符可以方便快速的給map新增內容

mapteldir["starlee"] = "13813131313";

//修改關鍵碼為lixing的值

//注意,這裡的關鍵碼在map裡面並不存在

if(mapteldir["lixing"] == "13913131313")

//輸出

cout<<"the cellhone number of lixing is: " << mapteldir["lixing"] << endl;

上面的**看起來似乎沒有任何問題,但是最後一行輸出的手機號碼卻永遠為空!原因就是在判斷語句裡面對map下標運算子的錯誤使用。

map的下標運算子的作用是:將key作為下標去執行查詢,並返回相應的值;如果不存在這個key,就將乙個具有該key和value的某人值插入這個map。

對於上面的**來說,if (mapteldir["lixing"] == "13913131313"),這行**首先去查詢map中是否有key為lixing的項,結果沒有發現該項,於是就向map中插入一項<"lixing", "">(string的預設值為空字串)。這就造成if語句的判斷結果永遠為false,那樣就不可能修改key為lixing的值。

為了更好的說明這個問題,可以看一下map下標運算子實現的**:

// 下面的**摘自vs2005中的..vcincludemap

iterator _where = this->lower_bound(_keyval);

if (_where == this->end()

|| this->comp(_keyval, this->_key(_where._mynode())))

_where = this->insert(_where,

return ((*_where).second);

}

map的下標操作符使用上面的方法定義,使向map裡插入值和使用key來訪問相應的value變得非常方便而快速。雖然在使用的時候會出現有人寫出類似上面那麼遠的錯誤**,但是這是程式設計師的錯誤,因為寫出正確的**是程式設計師的責任。這樣做很符合c++的風格:非常靈活,但要小心使用。

C 操作Cookie注意事項

這兩天一直在為乙個問題苦惱。那就是在vs中,不論我怎麼除錯,儲存的cookie在下次頁面登入的時候都能獲取到,並且可以使用。但是當我發布後,去訪問,這個cookie就這麼也沒有用了。剛開始以為是與瀏覽器有關係,與安全級別的設定有關。可是我後來直接把 設定為信任站點,也是沒有用。浪費了好幾個小時,忽然...

JS 屬性操作注意事項

下列東西不能拿來做判斷 1.所有的相對路徑 img.src href 1.css 2.顏色值不要拿來做判斷 color red f00 rgb 250,0,0 3.innerhtml值不要拿來做判斷 注意事項 js中允許 替換成 odiv.style.width 300px 操作不能設為變數 odi...

屬性操作注意事項02

lang en charset utf 8 documenttitle head 所有的相對路徑位址不能做判斷 1src 2href 3顏色值 rgb 4innerhtml的值不要拿來做判斷 表單元素 id btn1 type button value var oinp document.getel...