国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
慎用C++ std::map 的[]運算符
2008年09月18日 13:48:00
map的[]運算符在用法上和我們對[]常規(guī)理解大有出入,因此也往往很容易造成了使用上的失誤,在這點上我強烈認為stl設計犯了大錯。
首先看其函數聲明:
T& operator[] ( const key_type& x );在http://www.cplusplus.com/reference/stl/map/operator[].html 的描述中,該聲明等效于:(*((this->insert(make_pair(x,T()))).first)).second倏忽的程序員一不留意就會栽入陷阱,因為在我們的常規(guī)理解里,[]操作不應該對本不屬于容器自己的關鍵字做查詢操作。但map卻直接執(zhí)行了一次insert操作??匆韵麓a:#include <iostream>#include <map>using namespace std;class MapManager{public :    typedef map<string, string> MapNameToID;    string ret(const string& name)    {        return m_map[name];    }    void list()    {        for (   MapNameToID::iterator iter = m_map.begin();                iter != m_map.end();                ++iter)        {            cout << "(" << iter->first << ", " << iter->second << ")" << endl;        }    }private :    MapNameToID m_map;};int main(){    MapManager m;    cout << m.ret("yao") << endl;    cout << m.ret("jian") << endl;    m.list();    return 0;}
類MapManager的設計者本來希望通過ret(int index)查找關鍵字的值,但顯然設計者這么做實際上不小心給map加入了新元素當然,疏忽的地方在于,對于查詢函數,應該加上const保護類成員,這樣至少會編譯錯誤。也就是說,壓根在這里就不該使用[]重載,而是應該用find,當然,如果find之前沒有先判斷該key是否存在,那么查詢不存在的key將導致運行時錯誤?;蛟S[]重載正是為了保護查詢不存的key時,不會出現運行時錯誤而選擇了insert操作,但這樣似乎也不是好辦法。正確寫法:#include <iostream>#include <map>using namespace std;class MapManager{public :    typedef map<string, string> MapNameToID;    string ret(const string& name) const // 加const    {        MapNameToID::const_iterator iterRs = m_map.find(name);        if (m_map.end() != iterRs)        {               return iterRs->second; // 用find(name)->second;        }        else        {               return "";        }    }    void list()    {        for (   MapNameToID::iterator iter = m_map.begin();                iter != m_map.end();                ++iter)        {            cout << "(" << iter->first << ", " << iter->second << ")" << endl;        }    }private :    MapNameToID m_map;};int main(){    MapManager m;    cout << m.ret("yao") << endl;    cout << m.ret("jian") << endl;    m.list();    return 0;}
另外,說說另一個用法:
#include <iostream>#include <map>using namespace std;class K{public :    K()    {        cout << "K()" << endl;    }    K(int)    {        cout << "K(int)" << endl;    }};int main(){    map<int, K> mp;    K k;    mp[1] = K(3);    //mp.insert(map<int, K>::value_type(1, K(3)));    return 0;}
以上代碼輸出是:K()K()K(int)而直接用被注釋掉的insert的話輸出是:K()K(int)
這里存在的效率差別我就不多說了??傊琺ap的[]重載確實給我們帶來了編碼上感性上的便利,但總體而言,對于講究效率和代碼質量的程序員,似乎就不那么推薦使用了。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++中的map
boost::unordered_map 和 std::map 的效率,內存比較
C 之map find count
一個簡單的多叉樹C++實現
C++ find()函數用法(一般用于vector的查找)
也談表達式分析和計算
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服