std::地图::运营商[]
std::map::operator[]
我正在做一个简单的地图程序,但最终得到了这个问题。c++文档是这样说的:
元素的访问如果k与容器中某个元素的键匹配,则该函数返回对其映射值的引用。如果k与容器中任何元素的键不匹配,则该函数用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素分配映射值(元素是使用其默认构造函数构造的),也总是将容器大小增加1。
我真正不明白的部分是它说"元素是使用其默认构造函数构造的"。
我试了一下,做了这个
std::map<string, int> m;
m["toast"];
我只是想看看"toast"的映射元素是什么值。结果是0,为什么呢?基本类型有默认构造函数吗?或者发生了什么?
"使用其默认构造函数"的语句令人困惑。更准确地说,对于std::map::operator[],如果键不存在,则插入的值将被值初始化。
当使用默认分配器时,这将导致键是由键复制构造的,而映射的值是值初始化的。
对于int
,表示零初始化。
4)否则,对象为零初始化。
映射值由operator[]
值初始化,对于int
意味着零初始化。
根据标准(§23.4.4.3)的定义:
效果:如果映射中没有x对应的键,则将
value_type(x, T())
插入映射
T()
解释为(§8.5/10):
初始化项为空圆括号的对象(即
()
)应进行值初始化
意味着(§8.5/8):
对
T
类型的对象进行值初始化意味着:[…]
-否则,对象为零初始化。
和零初始化定义为(§8.5/6):
对
T
类型的对象或引用进行零初始化意味着:-如果T是标量类型,则该对象被设置为值0 (0);作为整型常量表达式,转换为
T
[…]
所有引语摘自n4140
相关文章:
- 如何使用 std::variant 打印地图键/值?
- 地图是否将元素存储为 std::p air?
- 来自带有 std::tuple 的地图
- std::在地图上查找无法正常工作并循环访问地图的键和值
- 如何打印属于地图的一系列元素(std::p air<size_t,std::string>)(不是所有元素)
- 您可以将STD :: MAP变成带有自定义比较器的无序地图吗?
- std ::地图没有父母指针
- std::unordered_map 如何释放使用 malloc 创建的结构.是否需要对地图进行 2 次查询
- 是 std::make_pair 在将对象添加到地图时创建副本
- GDB打印std ::地图元素
- Emplace到STD :: STD :: MAP的地图
- 如何使用可变参数模板作为 std::type_index 地图的键
- STLS STD :: MAP和STD :: vector;在地图中检查对象类型
- 在地图中使用std :: type_index作为值
- 拥有std ::地图不顺序
- 如何从地图返回标准::p空气的指针并将其放入vector<*std::p air...>
- STD ::地图分配
- C++ 如何打印此地图 std::map<int, pair<vector<pair<int, int>>, int>>
- 在两个略有不同的std ::地图之间投射
- 如何将std ::映射的第一个N元素复制到另一个地图