C++ 新std::map条目中指针的默认值

C++ 新std::map条目中指针的默认值,c++,pointers,stl,C++,Pointers,Stl,因此,我有以下std::map: std::map<int, float*> map; 现在,如果键123在映射中不存在,指针的值将是未定义的。对吗?要确保它是: template <class T> struct PtrWithDefault { T *p; PtrWithDefault() :p(0) {} // default PtrWithDefault(T *ptr) :p(ptr) {} PtrWithDefault(PtrW

因此,我有以下
std::map

std::map<int, float*> map;
现在,如果键123在映射中不存在,指针的值将是未定义的。对吗?要确保它是:

template <class T>
struct PtrWithDefault {
    T *p;
    PtrWithDefault() :p(0) {} // default
    PtrWithDefault(T *ptr) :p(ptr) {}
    PtrWithDefault(PtrWithDefault other) :p(other.p) {} // copy
    operator T *() { return p; }
};
std::map<int, PtrWithDefault<float> > map;
模板
结构PtrWithDefault{
T*p;
PtrWithDefault():p(0){}//默认值
PtrWithDefault(T*ptr):p(ptr){}
PtrWithDefault(PtrWithDefault-other):p(other.p){}//copy
运算符T*(){return p;}
};
地图;
现在,这样做可以确保指针的正确初始化。还有别的办法吗?这是一种丑陋的解决方案。我的最终目标是速度:

std::map<int, float*> map;
float *p;
std::map<int, float*>::iterator it = map.find(123);
if(it != map.end())
    p = (*it).second; // just get it
else
    map[123] = p = 0;
std::map;
浮动*p;
std::map::iterator it=map.find(123);
if(it!=map.end())
p=(*it).second;//去拿吧
其他的
map[123]=p=0;
这会比使用默认指针的解决方案更快吗?有更好的方法吗

编辑

好吧,我真是太傻了。正如Brian Bi正确地说的那样,由于零初始化,指针将自动初始化。值初始化是从C++03开始的,而C++98(VisualStudio2008中唯一可用的标准)没有

无论如何,它很容易验证为:

std::map<int, float*> map;
typedef float *P;
float *p = map[123], *p1 = P();
std::map;
typedef float*P;
float*p=map[123],*p1=p();

p
p1
实际上都是空的,不需要担心任何事情。

如果在映射中找不到键,则插入的值是初始化值(§23.4.4.3/1)。所以不需要包装纸;插入的指针将是空指针。

为什么不测试它呢?应该是
it!=map.end()。即使只在主要的编译器上测试也需要一些时间。伙计,这些天我真的应该阅读标准。这太棒了。
std::map<int, float*> map;
typedef float *P;
float *p = map[123], *p1 = P();