我是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双指针创建新元素
答案 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