std::map的一次錯誤應用(日積月累)

假設有以下變量std::map<int, int>::iterator it;  

問:*it返回的是什麼類型?

答:以前一直以爲是std::pair<int,int> &,而且以前將其做爲只讀變量使用也沒出過錯。直到最近,才發現自己原來錯了,錯誤代碼見下面:

//std::map<int, int> mapInt;

//此處省略變量的初始化過程

std::for_each(mapInt.begin(), mapInt.end(),  [](const std::pair<int,int> &pair)

{

         std::pair<int,int> &v =const_cast<std::pair<int,int>&>(pair);

         v.second = v.first * v.first;

});

結果執行完以上代碼後發現mapInt裏面的值沒有任何變化。爲此着實苦惱了一番,直到去閱讀std::map源代碼才發現,原來*it 返回的應該是std::pair<constint,int> &。 由於做std::for_each時,pair類型與*it的返回值不匹配,從而使得編譯器通過拷貝構造生成了一個臨時的std::pair<int,int>類型,但這樣一來不僅效率變低了,接下來的修改動作自然也就失敗了。

而修改成如下這樣就OK了:

//std::map<int, int> mapInt;

//此處省略變量的初始化過程

std::for_each(mapInt.begin(),mapInt.end(), [](std::map< int,int >::reference pair)

{

         pair.second = pair.first * pair.first;

});

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章