std::map<int,int> mapy;
++mapy[5];
可以安全地假设mapy[5]
它将始终为1吗?我的意思是,mapy[5]
即使在我的代码中未明确声明,也总是在“ ++”之前获得默认值0?
std::map<int,int> mapy;
++mapy[5];
可以安全地假设mapy[5]
它将始终为1吗?我的意思是,mapy[5]
即使在我的代码中未明确声明,也总是在“ ++”之前获得默认值0?
Answers:
使用[]运算符访问地图后,如果键不存在,则会添加该键。将调用int类型的默认初始化程序-因此它将获得0值。
int
的初始值是不确定的-可以是0,也可以是-99765521。是否曾经有未初始化int
为类变量的代码,并且这些古怪的值之一出现在您的程序中?就是说,我对此进行了测试,并且似乎可行。 #include <stdio.h> #include <map> using namespace std; int main() { map<int,int> m ; for( int i = 0 ; i < 100 ; i++ ) m[i]++ ; for( const pair<int,int>& p : m ) printf( "m[%d] => %d\n", p.first, p.second ) ; }
是的,假设是安全的。
这样operator[]
指定了地图:([map.access])
效果:如果
x
在地图中没有等效的键,则将其插入value_type(std::move(x), T())
到地图中。
返回:向A参照mapped_type
对应于x
在*this
。
T()
对除([expr.type.conv] / 2)以外的所有值都使用值初始化,而对基元使用值初始化会导致零初始化([dcl.init] / 7)T
void
。
因此,表达式的计算结果是对值为零([dcl.init] / 5)的对象的引用。
operator++
然后,该调用将该对象增加为1,并求值为1。
(所有参考文献均为C ++ 11。)
是的,默认值将是该类型的默认值。如果需要另一个默认值,则可以创建一个行为类似于int但具有不同默认构造函数的类。
Rep_Movsd的答案过于简单,可能导致许多极端危险的误解。C ++中的原始数据类型没有初始化程序。路易斯·布兰迪(Louis Brandy)进行了精彩的演讲,他讨论了Facebook上的许多常见C ++错误,并且误解了std :: map <> []的工作方式是他所讨论的错误之一,尽管他没有这样做,但这是一个很好的资源。详细介绍std :: map <> []的实际工作方式。
通常,像所有原始类型一样,int不会被初始化且未定义。话虽这么说,当与std :: map <> []一起使用时,int通过称为值初始化的过程将默认值设置为零。值初始化通常是一个与结构实际一起使用的过程。例如,
struct Struct {
Struct() : memberVariable() {}
int memberVariable;
};
始终会将int初始化为零。如果成员变量是其他原始类型,则它们还将具有特定的初始化值。例如,通过像这样的值初始化来初始化以下类型:
bool = false
float = 0.0f
enum =(枚举类型)0
指针=空指针
指向成员的指针=空成员指针
使用未显式初始化的数据时,请格外小心。最后一件事,请考虑以下代码
map<string, int> myMap;
cout << myMap["Foo"];
此代码不仅将始终将整数初始化为0,而且还将0插入到映射中。只是为了快速回顾一下,如果未初始化原始数据类型,则未定义它们,但是在某些情况下(例如,使用struct或map值初始化)会使用特定值初始化原始数据。
struct
关键字创建一个类。您显示的代码包含一个类。C ++没有结构。进一步阅读:stackoverflow.com/a/36917400/560648 stackoverflow.com/a/34108140/560648