C++ 使用C+创建直方图+;with map/unordered_map:不存在键的默认值

C++ 使用C+创建直方图+;with map/unordered_map:不存在键的默认值,c++,C++,我定义了一个小函数来创建整数向量的直方图,最初我定义了以下函数,在赋值或增加值之前,首先测试映射中是否存在键 map<int, int> histogram(vector<int> &a){ map<int, int> hist; for (auto &x : a){ hist[x] = hist.count(x) == 0 ? 1 : hist[x] + 1; // check key existence

我定义了一个小函数来创建整数向量的直方图,最初我定义了以下函数,在赋值或增加值之前,首先测试映射中是否存在键

map<int, int> histogram(vector<int> &a){
     map<int, int> hist;
     for (auto &x : a){
         hist[x] = hist.count(x) == 0 ? 1 : hist[x] + 1; // check key existence 
     }
     return hist;
}
地图直方图(矢量&a){
地图历史;
用于(自动和x:a){
hist[x]=hist.count(x)==0?1:hist[x]+1;//检查键是否存在
}
返回历史;
}
后来,我发现下面的代码也可以在不检查密钥存在的情况下工作。因此,不存在的密钥的默认值应为零。我想知道,当引用一个不存在的键时,这种行为是否保证有一个默认的零值

map<int, int> histogram(vector<int> &a){
     map<int, int> hist;
     for (auto &x : a){
         hist[x]++;        // without key existence checking. 
     }
     return hist;
}
地图直方图(矢量&a){
地图历史;
用于(自动和x:a){
hist[x]++;//不进行密钥存在性检查。
}
返回历史;
}

对于内置类型,它保证为零初始化,对于用户定义的类型,它保证为默认构造。保证是,如果给定键的元素不存在,则插入一个元素,并初始化映射的_类型值。对于内置类型,如
int
,这意味着零初始化


更多信息请参见。

这是由
std::map
的重载行为保证的。如果密钥不存在,则将为您初始化该值。由于
int
,当初始化的值被指定为零时,您在这里是安全的。

是的,
[]
插入的值保证为零。从C++11 23.4.4.3/1开始:

效果:如果地图中没有与
x
等价的键,则将
value\u type(x,T())
插入地图


T()
指定值初始化,对于数值类型,这意味着它是用值零初始化的。

不保证,对于调试版本可能是真的。@leif完全保证。映射的_类型元素是值初始化的。如果不能保证(事实上是这样),那么第一个方法将无法修复它:对
=
的两个操作数的求值是不排序的,因此左侧可能会在右侧调用
count
@Mike之前插入一个值。我假设三元运算符(?)以短路方式进行计算。代码不计算另一个分支。@spacepure:确实如此。但是
=
的左侧计算
hist[x]
,因此可能会在右侧调用
count
之前插入一个值。如果该值不为零,那么您将在地图中得到一个虚假值。