Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;地图元素没有';如果我提到它,就不会被抹掉 玩C++标准库的STD::map类,注意如果我擦除一个元素,然后尝试引用它(下面代码中的注释行),元素将返回值为0。这是预期的吗?如果一个元素不存在,您真的必须使用find函数来访问它而不意外地创建它吗_C++_Map_Std - Fatal编程技术网

C++;地图元素没有';如果我提到它,就不会被抹掉 玩C++标准库的STD::map类,注意如果我擦除一个元素,然后尝试引用它(下面代码中的注释行),元素将返回值为0。这是预期的吗?如果一个元素不存在,您真的必须使用find函数来访问它而不意外地创建它吗

C++;地图元素没有';如果我提到它,就不会被抹掉 玩C++标准库的STD::map类,注意如果我擦除一个元素,然后尝试引用它(下面代码中的注释行),元素将返回值为0。这是预期的吗?如果一个元素不存在,您真的必须使用find函数来访问它而不意外地创建它吗,c++,map,std,C++,Map,Std,编译器设置:我使用g++i686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1(基于apple Inc.build 5658)(llvm build 2336.11.00)在osx 10.8.3上编译 如果在未注释行的情况下运行,则printf语句中myMap[1]的访问将创建另一个元素,并留下以下结果: 1=>5 地图测试结果:5 地图测试结果:0 元素@键1存在,错误 映射不是空的,错误 1 => 0 是的,这就是std::map的操作员[]应该做的事情。根据标

编译器设置:我使用g++i686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1(基于apple Inc.build 5658)(llvm build 2336.11.00)在osx 10.8.3上编译

如果在未注释行的情况下运行,则printf语句中myMap[1]的访问将创建另一个元素,并留下以下结果:

1=>5
地图测试结果:5
地图测试结果:0
元素@键1存在,错误
映射不是空的,错误
1 => 0

是的,这就是
std::map
操作员[]
应该做的事情。根据标准(C++11,§23.5.4.3):

[……]

效果:如果无序映射尚未包含键等于k的元素,则第一个运算符插入值
value\u-type(k,mapped\u-type())
,第二个运算符插入值
value\u-type(std::move(k,mapped\u-type())

请注意,即使该元素从未被插入然后被擦除,也会发生这种情况。使用
operator[]
的元素访问在将其应用于不存在的键时,只需插入新的默认构造值


如果您不想这样做,最好使用
std::map
find
功能。如果该键不存在,则将返回一个
end
-迭代器。

是,这是预期的行为。除了阅读规范外,您还可以从类型签名推断:

T& operator[] (const key_type& k);

它无法判断您是否会最终分配给键,因为在
[]
操作符已经完成执行之后,会在其返回值上调用
操作符=
。该方法也无法表示空值:它返回一个引用,而不是指针。

+1(虽然从理论上讲,映射可以返回对某种伪元素的引用。这将是一种奇怪的设计,但并非不可能)。它的工作方式现在非常适合于计数器或容器映射。map[key]++或map[key].push_-back(value)比不这样做的语言(如java)中的等价语言要干净得多@jogojapan!当然,可以通过查看
T
是否与您在
std::map
中给出的
T
相同来检查这一点。
mapped_type& operator[](const key_type& k);
mapped_type& operator[](key_type&& k);
T& operator[] (const key_type& k);