2016-12-05 87 views
1

考慮下面的代碼:混亂與C++ STL容器[]操作和默認值

unordered_map<string, vector<string>> hashtable; 
string s = "foo"; 
hashtable[s].push_back("bar"); 

這似乎是工作,但是這意味着,在第三行,它是既添加新的條目添加到散列表通過初始化關鍵字「foo」處的字符串向量以及向該空向量添加「bar」。我的困惑是怎麼來的,我們沒有明確初始化像一個向量:

unordered_map<string, vector<string>> hashtable; 
string s = "foo"; 
vector<string> vec; 
vec.push_back("bar"); 
hashtable[s] = vec; 

添加到我的困惑是,當我們面對的是這樣的東西在C++中初始化數組,這是好事,明確初始化類的數組所以:

​​

,如果我們要確保陣列的所有值是因爲沒有它初始化爲0這是必需的,有可能是在同一個地方的陣列初始化時存儲在內存中的垃圾值。與哈希表要回我的第一個問題,我們怎麼知道

hashtable[s].push_back("bar"); 

不推「酒吧」與垃圾值的載體?

我意識到我的問題根本不清楚。任何澄清與行爲[]運營商和默認值的STL容器是普遍的,將不勝感激。

回答

5
  1. 我的困惑是怎麼來的,我們沒有明確初始化向量

這是std::unordered_map::operator[]預期的行爲,將執行與值初始化映射值插入如果密鑰不存在。

返回映射到等效於鍵的鍵的值的引用,如果此鍵尚不存在,則執行插入操作。

這意味着用於hashtable[s].push_back("bar");,值初始化std::vector(即空std::vector)將被插入在第一,則矢量將參考由std::unordered_map::operator[]返回。然後在矢量上調用push_back("bar")(然後其大小變爲1幷包含一個元素)。

  1. 是不是將「bar」推入具有垃圾值的向量?

否,std::vector是不相同爲原料陣列,它的大小是動態的。如上所述,初始化值爲std::vector爲空,其大小爲0,仍不包含任何元素(以及任何「垃圾值」)。