与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"添加到这个空的矢量中,从而为hashable添加了新的条目。我的困惑是我们如何不必明确初始化一个矢量:
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");
不将"栏"推入具有垃圾值的向量?
我意识到我的问题根本不清楚。一般对[]运算符的行为和默认值的行为进行的任何澄清将不胜感激。
- 我的困惑是我们如何不必明确初始化向量
这是std :: unordered_map :: operator []的预期行为,如果键不存在,它将执行带有值initialized映射的值的插入。
返回对映射到相当于键的键的值的引用,如果尚不存在此类密钥,则执行插入。
这是指hashtable[s].push_back("bar");
,首先将插入一个值initialized std::vector
(即一个空的std::vector
),然后将通过std::unordered_map::operator[]
返回向量。然后在向量上调用 push_back("bar")
(然后其大小变为 1
并包含一个元素)。
- 不将"栏"推入具有垃圾值的向量?
no,std::vector
与RAW数组不同,其大小是动态的。如上所述,值initialized std::vector
是空的,其大小为 0
,仍然不包含任何元素(以及任何"垃圾值")。
相关文章:
- 默认赋值运算符如何在实际 STL 中实现
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 与C STL容器[]运算符和默认值混淆
- 默认赋值运算符有权访问基类的私有成员
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 三元运算符默认值
- 默认的复制构造函数和复制赋值运算符给出奇怪的错误
- 下标 [] 运算符的默认值
- 在这种情况下,我们需要禁用默认的复制构造函数和赋值运算符
- 错误:非静态引用成员,无法使用默认赋值运算符
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 如果类具有引用数据成员,为什么编译器不合成默认赋值运算符
- 模板赋值运算符不替换默认赋值运算符
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 具有不同模板参数的模板类的默认赋值运算符
- 重载赋值运算符或使用默认运算符
- 为什么我不能在 C++ 中使用模板版本覆盖默认的复制构造函数和赋值运算符