与C ++ STL container []运算符和默认值混淆

时间:2016-12-05 01:39:13

标签: c++ arrays vector stl unordered-map

请考虑以下代码:

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 ++中初始化数组这样的事情时,最好像这样显式初始化数组:

int array[10] = {0);

如果我们想确保数组初始化时所有值都为0,那么这是必需的,因为如果没有它,可能会在数组初始化的同一位置存储在内存中的垃圾值。回到哈希表的第一个问题,我们怎么知道

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

是不是将“bar”推入带有垃圾值的向量?

我意识到我的问题根本不清楚。对[]运算符的行为和STL容器的默认值的任何澄清都是一般的,我们将不胜感激。

1 个答案:

答案 0 :(得分:5)

  
      
  1. 我的困惑是我们怎么没有明确初始化一个载体
  2.   

这是std::unordered_map::operator[]的预期行为,如果密钥不存在,它将使用值初始化的映射值执行插入。

  

返回对映射到等效于key的键的值的引用,如果此类键尚不存在则执行插入。

这意味着对于hashtable[s].push_back("bar");,首先会插入一个值初始化的std::vector(即空std::vector),然后{{1}将通过引用返回该向量}。然后在向量上调用std::unordered_map::operator[](然后它的大小变为push_back("bar")并包含一个元素。)

  
      
  1. 是不是将“bar”推入带有垃圾值的向量中?
  2.   

不,1与原始数组不同,其大小是动态的。如上所述,值初始化std::vector为空,其大小为std::vector,仍然不包含任何元素(以及任何“垃圾值”)。