返回信息流#include <iostream>
#include <map>
using namespace std;
int main() {
int a[] = {1,1,2,2,2};
map<int, int> m;
for (int i = 0; i < sizeof(a) / sizeof(int); ++i) {
++m[a[i]]; // 插入元素的时候,value默认初始化为0?
}
for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
cout << it->first << " -> " << it->second << endl;
}
system("pause");
return 0;
}
用g++和vs试了一下,map用[]操作符插入pair<int, int>,不指定value的值时,第二个int都默认是0。请问这个c++标准有保证吗?
c++ reference只说插入不指定value时,调用value的默认构造函数,并没有保证int会初始化为0。
这是一条镜像帖。来源:北邮人论坛 / cpp / #91819同步于 2016/5/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
map的[]操作符
xiaobing307
2016/5/26镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
会的。[]运算符如果可以不存在,会初始化value的。这是有标准的。
【 在 xiaobing307 的大作中提到: 】
: [code=c]
: #include <iostream>
: #include <map>
: ...................
【 在 zx723 的大作中提到: 】
: 标准保证,简单优雅
其实我……
下面也都是标准保证。JavaScript代码:
print([] + []) # 空字符串
print([] + {}) # [object Object] 一定打印出这个字符串
print(+[]) # 0
print(+{}) # NaN
print(Array(5)) # ,,,, 打印出三个逗号
print(Array(5).join("foo")) # foofoofoofoo
print(Array(5).join("foo"+1)) # foo1foo1foo1foo1
print(Array(5).join("foo"-1)+"Batman!") # NaNNaNNaNNaNBatman!
确实
http://en.cppreference.com/w/cpp/container/map/operator_at
If an insertion is performed, the mapped value is value-initialized (default-constructed for class types, zero-initialized otherwise) and a reference to it is returned.
http://www.cplusplus.com/reference/map/map/operator[]/
Notice that this always increases the container size by one, even if no mapped value is assigned to the element (the element is constructed using its default constructor).
看来上面cppreference网站好一点
【 在 zx723 的大作中提到: 】
: 标准保证,简单优雅