Bil*_*ias 66 c++ dictionary default
std::map<int,int> mapy;
++mapy[5];
Run Code Online (Sandbox Code Playgroud)
假设mapy[5]
永远是1 是安全的吗?我的意思是,mapy[5]
在'++'之前总是会得到默认值0,即使没有显式声明,就像我的代码一样?
rep*_*vsd 103
只要您使用[]运算符访问地图,如果该密钥不存在,则会添加该密钥.调用int类型的默认初始值设定项 - 因此它将获得值0.
Lig*_*ica 29
是的,可以安全地假设.
operator[]
因此指定了地图:([map.access])
效果:如果
x
地图中没有等效的键,则插入value_type(std::move(x), T())
到地图中.
返回:mapped_type
对应的x
in的引用*this
.
T()
对除([expr.type.conv]/2)之外的所有值使用值初始化,并且原语的值初始化导致零初始化([dcl.init]/7).T
void
因此,表达式求值为对值为零的对象的引用([dcl.init]/5).
operator++
然后,该调用将该对象增加到1,并计算为1.
(所有引用都是C++ 11.)
Rep_Movsd 的回答过于简单化,很可能会导致许多极其危险的误解。C++ 中的原始数据类型没有初始值设定项。Louis Brandy 有一个精彩的演讲,他讨论了在 Facebook 上犯的许多常见的 C++ 错误,对 std::map<>[] 工作方式的误解是他讨论的错误之一,这是一个很好的资源,尽管他没有详细了解 std::map<>[] 的实际工作方式。
通常,int 不会像所有原始类型一样被初始化和未定义。话虽如此,当与 std::map<>[] 一起使用时,int 的默认值为零,通过称为值初始化的过程设置。值初始化是一个实际上与一般结构一起工作的过程。例如,
struct Struct {
Struct() : memberVariable() {}
int memberVariable;
};
Run Code Online (Sandbox Code Playgroud)
将始终将 int 初始化为零。如果成员变量是其他原始类型,它们也将具有特定的初始化值。例如,以下类型被初始化,通过像这样的值初始化:
bool = false
float = 0.0f
enum = (enum type)0
pointer = null pointer
pointer to member = null member pointer
处理未显式初始化的数据时要格外小心。最后一件事,请考虑以下代码
map<string, int> myMap;
cout << myMap["Foo"];
Run Code Online (Sandbox Code Playgroud)
这段代码不仅总是将整数初始化为 0,而且还会将 0 插入到映射中。快速回顾一下,原始数据类型如果未初始化则是未定义的,但在某些情况下,例如使用结构或映射值初始化将使用特定值初始化原始数据。