2012-12-29 68 views
-1

我想了解如何初始化std :: map。我看到在網絡上初始化地圖的方式如下(注意Test& t = mylist[0]部分):爲什麼這個特殊的std :: map初始化工作?

#include <iostream> 
#include <map> 

using namespace std; 

class Test 
{ 
    public: 
    Test():i_(0) { cout<<"Calling constructor"<<endl;} 
    ~Test() { cout <<"Calling destructor"<<endl;} 
    private: 
    int i_; 
}; 

int main(int argc, char **argv) 
{ 
    map<unsigned,Test> mylist; 
    cout << "Before "<<mylist.size()<<endl; 
    Test& t = mylist[0]; 
    cout << "After "<<mylist.size()<<endl; 
    return 0; 
} 

天真,我本來期望以下工作,

Test t; 
mylist[0] = t; 

但它傷害了我的大腦思考爲什麼第一種方法正常工作!對象如何初始化?是否是暫時的,因爲在技術上僅僅寫入表達mylist[0];會創建一個對象(但是怎麼樣?)

在此先感謝!

+5

如果操作符[]不存在,則將其插入到映射中。因此,地圖中有一個有效的對象用於參考。 – chris

+2

@chris聽起來像是對我的回答。 – Corbin

+0

@chris謝謝你!我查了一下操作符[],如果不存在,它肯定會插入一個新元素。乾杯! – covariantmonkey

回答

4

根據cppreference.com

[std::map::operator[]]插入到使用密鑰作爲密鑰和一個默認構造映射值的容器的新元素,並返回到新建成的映射值的引用。如果具有鍵key的元素已經存在,則不執行插入並返回對其映射值的引用。

這意味着,當執行Test& t = mylist[0];Test()被稱爲(你會看到「調用構造函數」)這個對象插入到mapmylist」與0的關鍵。由於在調用時該地圖中沒有該鍵的元素,因此此操作將mylist的大小增加1。

+0

謝謝!就是這樣! – covariantmonkey

1

是的std :: map上的[]運算符將使用值類的默認構造函數創建一個新對象。

http://www.cplusplus.com/reference/map/map/operator[] /:

如果x不匹配的容器中的任何元素的鍵,所述 函數插入一個新元素與該鍵並返回一個參考 其映射的值。請注意,即使未將映射值分配給元素(使用其默認構造函數構造元素 ),也總會將地圖大小增加 個。

如果該類沒有默認構造函數,將會出現編譯器錯誤。

+0

謝謝。很高興知道默認的構造函數。 – covariantmonkey

相關問題