假設有以下變量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;
});