为什么map使用运算符[]创建新条目

Why does map create new entries with operator[]

本文关键字:创建 新条目 运算符 map 为什么      更新时间:2023-10-16

我是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要创建带有空双指针的新元素

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

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

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

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

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

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

或通过std::map::insert:指定密钥和值

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

编写testMap[sym]时,将检查映射中是否存在sym,如果存在,则返回对它的引用。如果没有,则初始化的新条目值将插入到具有关键字sym的映射中,在您的情况下,它是一个空指针。

所以,如果您不想拥有null值,请使用std::map::find检查密钥是否存在,并与std::map::end()进行比较,而不是使用std::map::operator[]

我的问题是为什么map会创建带有空双指针的新元素

这就是标准如何定义std::map::operator[]的行为

n4140 23.4.4.3地图访问

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

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

和:

T&operator[](key_type&&x);

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

这就是地图的工作方式。必须检查地图上的钥匙是否全部装好。使用find(键)。在您的示例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