【问题标题】:Confusion with C++ STL container [] operator and default values与 C++ STL 容器 [] 运算符和默认值混淆
【发布时间】:2016-12-05 01:39:13
【问题描述】:

考虑以下代码:

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 容器的默认值的说明都是一般性的,我们将不胜感激。

【问题讨论】:

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


    【解决方案1】:
    1. 我的困惑是为什么我们不必显式初始化向量

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

    返回对映射到与 key 等效的键的值的引用,如果这样的键不存在,则执行插入。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多