map <int,int>默认值

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.

  • 它的工作方式与您想象的不同.int x; 使x得到一个未定义的值int x = int(); 再次x得到0 class foo {int x; foo():x(){}}; foo f; 这里fx将为零 (27认同)

Lig*_*ica 29

是的,可以安全地假设.

operator[]因此指定了地图:([map.access])

效果:如果x地图中没有等效的键,则插入value_type(std::move(x), T())到地图中.
返回:mapped_type对应的xin的引用*this.

T()对除([expr.type.conv]/2)之外的所有使用值初始化,并且原语的值初始化导致零初始化([dcl.init]/7).Tvoid

因此,表达式求值为对值为零的对象的引用([dcl.init]/5).

operator++然后,该调用将该对象增加到1,并计算为1.

(所有引用都是C++ 11.)

  • 不知道为什么您的答案被否决是因为您是正确的。这正是规范所说的(我自己检查了一下)。 (2认同)

Ras*_*Kaj 9

是的,默认值将是该类型的默认值.如果需要其他默认值,可以创建一个行为类似于int但具有不同默认构造函数的类.


Rac*_*sey 9

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 插入到映射中。快速回顾一下,原始数据类型如果未初始化则是未定义的,但在某些情况下,例如使用结构或映射值初始化将使用特定值初始化原始数据。

  • _“C++ 中的原始数据类型没有初始值设定项”_ 这过于简单化,可能会导致危险的误解。_“未初始化”_ 不。好吧,不完全是。它被称为 _default-initialization_ 但结果是一个不确定的值 (C++11 8.5/11)。_“未定义”_ 不。不确定。_“结构”_ C++ 没有结构。_“值初始化”_ 正确。关键是使用了不同类型的初始化。你的散文中也有一些逗号拼接。 (2认同)