#include <iostream> #include <map> //map #include <string> //string using namespace std; int main() { std::map<string, string> mymap; //借用 operator[] 新增新鍵值對 mymap["STL教學"] = "http://c.biancheng.net/java/"; cout << "old mymap:" << mymap["STL教學"] << endl; //借用 operator[] 更新某個鍵對應的值 mymap["STL教學"] = "http://c.biancheng.net/stl/"; cout << "new mymap:" << mymap["STL教學"] << endl; //借用insert()新增新鍵值對 std::pair<string, string> STL = { "Java教學","http://c.biancheng.net/python/" }; std::pair<std::map<string, string>::iterator, bool> ret; ret = mymap.insert(STL); cout << "old ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl; //借用 insert() 更新鍵值對 mymap.insert(STL).first->second = "http://c.biancheng.net/java/"; cout << "new ret.iter = <" << ret.first->first << ", " << ret.first->second << ">" << endl; return 0; }程式執行結果為:
old mymap:http://c.biancheng.net/java/
new mymap:http://c.biancheng.net/stl/
old ret.iter = <{Java教學, http://c.biancheng.net/python/}, 1>
new ret.iter = <Java教學, http://c.biancheng.net/java/>
顯然,map 模板類中 operator[ ] 和 insert() 的功能發生了重疊,這就產生了一個問題,誰的執行效率更高呢?有關程式中 operator[ ] 和 insert() 成員方法的具體用法,讀者可翻閱前面的文章做詳細了解,這裡不再做過多解釋。
mymap["STL教學"] = "http://c.biancheng.net/java/";此行程式碼中,mymap["STL教學"] 實際上是 mymap.operator[ ](“STL教學”) 的縮寫(底層呼叫的 operator[ ] 方法),該方法會返回一個指向 “STL教學” 對應的 value 值的參照。
typedef map<string, string> mstr; //建立要新增的預設鍵值對元素 pair<mstr::iterator, bool>res = mymap.insert(mstr::value_type("STL教學", string())); //將新鍵值對的值賦值為指定的值 res.first->second = "http://c.biancheng.net/java/";
可以看到,使用 operator[ ] 新增新鍵值對元素的流程是,先構造一個有預設值的鍵值對,然後再為其 value 賦值。注意,這裡的 value_type(K,T) 指的是 map 容器中儲存元素的型別,其實際上就等同於 pair<K,T>。
mymap.insert(mstr::value_type("STL教學", "http://c.biancheng.net/java/"));此行程式碼和上面程式的執行效果完全相同,但它省略了建立臨時 string 物件的過程以及解構該物件的過程,同時還省略了呼叫 string 類過載的賦值運算子。由於可見,同樣是完成向 map 容器新增新鍵值對,insert() 方法比 operator[ ] 的執行效率更高。
//operator[] mymap["STL教學"] = "http://c.biancheng.net/stl/"; //insert() std::pair<string, string> STL = { "Java教學","http://c.biancheng.net/python/" }; mymap.insert(STL).first->second = "http://c.biancheng.net/java/";僅僅從語法形式本身來考慮,或許已經促使很多讀者選擇 operator[ ] 了。接下來,我們再從執行效率的角度對比以上 2 種實現方式。