为什么map使用operator []创建新条目

时间:2016-04-14 08:11:56

标签: c++ pointers

我是c +的新手,并且有一个简单的程序,如下所示

#include <iostream>
#include <map>
#include <vector>

using namespace std;

int main()
{
 std::map<std::string, double*> testMap;
 std::vector<std::string> v = {"A", "B", "C"};
 for(size_t i=0;i<v.size();++i)
 {
   std::string sym = v[i];
   double* d = testMap[sym];
   if(!d) continue;
   cout << "this";
 }
 for(std::map<std::string, double*>::iterator  itr=testMap.begin();itr!=testMap.end();++itr)
 {
    cout << itr->first << " " << itr->second << std::endl;
 }

 return 0;
}

及其O / P

sh-4.3$ main                                                                                                                                                  
A 0                                                                                                                                                           
B 0                                                                                                                                                           
C 0  

我的问题是为什么map使用null双指针创建新元素

3 个答案:

答案 0 :(得分:4)

这是std::map::operator[]的预期行为:

  

返回对映射到等效于的键的值的引用   键,如果此键尚不存在则执行插入。

     

如果执行插入,则映射值将进行值初始化   (默认为类类型构造,否则为零初始化)和   返回它的引用。

对于double*,零初始化值是空指针。

您可以修改std::map::operator[]插入的值:

testMap[sym] = ...something...;

或按std::map::insert指定键和值:

testMap.insert({sym, ...something...});

答案 1 :(得分:1)

当你写testMap[sym]时,检查是否sym存在于地图中,如果确实存在,则返回引用它。如果没有,则初始化的新条目值将插入带有键sym的映射中,在您的情况下,它是一个空指针。

因此,如果您不想拥有空值,请检查密钥是否与std::map::find一致,并与std::map::end()进行比较,而不是使用std::map::operator[]

  

我的问题是为什么map使用null双指针创建新元素

这是标准定义std::map::operator[]

行为的方式

n4140 23.4.4.3 map.access

  

T&安培; operator [](const key_type&amp; x);

     

效果:如果地图中没有等效于x的键,则插入   value_type(x,T())进入地图。

  

T&安培; operator [](key_type&amp;&amp; x);

     

效果:如果地图中没有等效于x的键,则将value_type(std :: move(x),T())插入   地图。

答案 2 :(得分:0)

这就是地图的工作方式。 必须检查地图是否所有密钥都是raedy。 使用find(key)。在你的例子testMap [sym];创建一个新条目。

std::map<std::string,double*>::iterator it;
it = testMap.find("A");
if ( it == testMap.end() )
{ // create a new entry
   testMap["A"] = new double(1.0);
}

匹配乐趣 Hilko