繁体   English   中英

与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”处初始化字符串向量,又向此空向量添加“ 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. 我的困惑是为什么我们不必显式初始化向量

这是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 ,仍然不包含任何元素(和任何“垃圾值”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM