与C STL容器[]运算符和默认值混淆

Confusion with C++ STL container [] operator and default values

本文关键字:默认值 运算符 STL 容器      更新时间:2023-10-16

考虑以下代码:

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

这似乎有效,但这意味着,在第三行中,它都通过在键" foo"处初始化字符串向量以及将" bar"添加到这个空的矢量中,从而为hashable添加了新的条目。我的困惑是我们如何不必明确初始化一个矢量:

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");

不将"栏"推入具有垃圾值的向量?

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

  1. 我的困惑是我们如何不必明确初始化向量

这是std :: unordered_map :: operator []的预期行为,如果键不存在,它将执行带有值initialized映射的值的插入。

返回对映射到相当于键的键的值的引用,如果尚不存在此类密钥,则执行插入。

这是指hashtable[s].push_back("bar");,首先将插入一个值initialized std::vector(即一个空的std::vector),然后将通过std::unordered_map::operator[]返回向量。然后在向量上调用 push_back("bar")(然后其大小变为 1并包含一个元素)。

  1. 不将"栏"推入具有垃圾值的向量?

no,std::vector与RAW数组不同,其大小是动态的。如上所述,值initialized std::vector是空的,其大小为 0,仍然不包含任何元素(以及任何"垃圾值")。