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

C++ 与C+混淆+;STL容器[]运算符和默认值,c++,arrays,vector,stl,unordered-map,C++,Arrays,Vector,Stl,Unordered Map,考虑以下代码: unordered_map<string, vector<string>> hashtable; string s = "foo"; hashtable[s].push_back("bar"); 如果我们想确保数组初始化时所有值都为0,那么这是必需的,因为如果没有它,内存中可能会有垃圾值存储在数组初始化时所在的位置。回到我关于哈希表的第一个问题,我们怎么知道 hashtable[s].push_back("bar"); 把“条”推到一个有垃圾值的向量中

考虑以下代码:

unordered_map<string, vector<string>> hashtable;
string s = "foo";
hashtable[s].push_back("bar");
如果我们想确保数组初始化时所有值都为0,那么这是必需的,因为如果没有它,内存中可能会有垃圾值存储在数组初始化时所在的位置。回到我关于哈希表的第一个问题,我们怎么知道

hashtable[s].push_back("bar");
把“条”推到一个有垃圾值的向量中不是吗

我意识到我的问题一点也不清楚。如果对[]运算符的行为和STL容器的默认值有任何澄清,我们将不胜感激

  • 我的困惑是为什么我们不必显式初始化向量
  • 这是的预期行为,如果键不存在,它将使用值初始化映射值执行插入

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

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

  • 把“条”推到一个有垃圾值的向量中不是吗
  • 不,
    std::vector
    与原始数组不同,它的大小是动态的。如上所述,初始化的值
    std::vector
    为空,其大小为
    0
    ,仍然不包含任何元素(以及任何“垃圾值”)

  • 我的困惑是为什么我们不必显式初始化向量
  • 这是的预期行为,如果键不存在,它将使用值初始化映射值执行插入

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

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

  • 把“条”推到一个有垃圾值的向量中不是吗
  • 不,
    std::vector
    与原始数组不同,它的大小是动态的。如上所述,初始化的值
    std::vector
    为空,其大小为
    0
    ,仍然不包含任何元素(以及任何“垃圾值”)

    int array[10] = {0);
    
    hashtable[s].push_back("bar");