2016-12-05 51 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,仍不包含任何元素(以及任何“垃圾值”)。