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?
只要您使用[]操作符访问地图,如果键不存在,它将被添加。 int会触发“值初始化”,因此它将获得值0。
int
的初始值是_未定义的_ - 也就是说它可能是0,也可能是-99765521。您是否曾经在类变量中使用未初始化的 int
并出现了这些古怪的值? 话虽如此,我测试了一下,似乎可以工作。 #include <stdio.h> <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 ) ; }
- bobobobo可以肯定地认为是安全的。
该映射的operator[]
指定如下:([map.access])
作用:如果在映射中没有与
x
等效的键,则将value_type(std::move(x), T())
插入映射中。
返回:指向*this
中对应于x
的mapped_type
的引用。
T()
对除了void
([expr.type.conv]/2)的所有T
使用值初始化,对于原始类型,值初始化会导致零初始化([dcl.init]/7)。
因此,该表达式计算出一个具有零值的对象的引用([dcl.init]/5)。
然后operator++
调用将该对象增加到一,并计算为一。
(所有引用均为C++11。)
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 = (enum type)0
指针 = null 指针
成员指针 = null 成员指针
在处理未明确初始化的数据时要非常小心。最后,请考虑以下代码
map<string, int> myMap;
cout << myMap["Foo"];
这段代码不仅会将整数值始终初始化为0,还会将0插入到映射中。简单回顾一下,原始数据类型如果没有初始化将是未定义的,在某些情况下,比如结构体或映射值初始化时将使用特定值初始化原始数据。
map<int,int>的默认值将为0;
如果您想将其更改为-1,则可以使用以下方法。
#include <bits/stdc++.h>
using namespace std;
struct AnotherVal{
int value = -1; // can be changed as per requirement
};
int main()
{
map<int, AnotherVal> tempmap;
cout << tempmap[1].value << endl;
return 0;
}
输出:
-1
希望这能帮到您!