c++ - 混淆 C++ STL 容器 [] 运算符和默认值

标签 c++ arrays vector stl unordered-map

考虑以下代码:

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

这似乎可行,但这意味着在第三行中,它通过在键“foo”处初始化字符串 vector 以及向该空 vector 添加“bar”来向哈希表添加新条目。我的困惑是为什么我们不必像这样显式初始化 vector :

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

不是将“条”插入具有垃圾值的 vector 吗?

我发现我的问题一点都不清楚。对 [] 运算符的行为和 STL 容器的默认值的任何说明都是一般性的,我们将不胜感激。

最佳答案

  1. My confusion is how come we don't have to explicitly initialize a vector

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

Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.

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

  1. isn't pushing "bar" into a vector with garbage values?

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

关于c++ - 混淆 C++ STL 容器 [] 运算符和默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40965900/

相关文章:

javascript - getElementbyId 的函数数组

在特定位置用另一个向量的元素替换一个向量的元素

c++ - 使用同一组参数分隔内部和外部构造函数

c++ - 二项式系数函数 C++ 的不同输出

java - 为什么我不能将浮点二维数组从函数返回到主类?

java - 为什么Java中的 vector 必须同步?

java - 在java中计算 double vector 的平均值

c++ - 如何查找给定字符串是否符合十六进制表示法,例如。没有正则表达式的 0x34FF?

C++ 对象的快速排序 vector

arrays - 对如何使用变异感到困惑