混淆 C++ STL 容器 [] 运算符和默认值
Confusion with C++ STL container [] operator and default values
考虑以下代码:
unordered_map<string, vector<string>> hashtable;
string s = "foo";
hashtable[s].push_back("bar");
这似乎可行,但这意味着在第三行中,它通过在键 "foo" 处初始化字符串向量以及添加 [=27= 来向哈希表添加新条目] 到这个空向量。我的困惑是为什么我们不必像这样显式初始化向量:
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 容器的默认值的任何说明都是一般性的,我们将不胜感激。
- 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 13=]。然后在向量上调用 push_back("bar")
(然后它的大小变为 1
并包含一个元素)。
- isn't pushing "bar" into a vector with garbage values?
不,std::vector
与原始数组不同,它的大小是动态的。如上所述,值初始化的 std::vector
是空的,它的大小是 0
,仍然不包含任何元素(和任何 "garbage values")。
考虑以下代码:
unordered_map<string, vector<string>> hashtable;
string s = "foo";
hashtable[s].push_back("bar");
这似乎可行,但这意味着在第三行中,它通过在键 "foo" 处初始化字符串向量以及添加 [=27= 来向哈希表添加新条目] 到这个空向量。我的困惑是为什么我们不必像这样显式初始化向量:
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 容器的默认值的任何说明都是一般性的,我们将不胜感激。
- 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 13=]。然后在向量上调用 push_back("bar")
(然后它的大小变为 1
并包含一个元素)。
- isn't pushing "bar" into a vector with garbage values?
不,std::vector
与原始数组不同,它的大小是动态的。如上所述,值初始化的 std::vector
是空的,它的大小是 0
,仍然不包含任何元素(和任何 "garbage values")。