新的STD :: MAP条目中指针的默认值



所以我有以下std::map

std::map<int, float*> map;

使用其operator []访问此地图:

float *pointer = map[123];

现在,如果密钥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;

现在进行相同的操作可确保指针的正确初始化。还有其他方法吗?这是一种丑陋的解决方案。我的最终目标是速度:

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;

这会比使用默认指针的解决方案快吗?有更好的方法吗?

编辑

好吧,这对我来说完全是愚蠢的。正如Brian BI正确地说,由于零限制,指针将自动初始化。由于C 03,因此存在值初始化,而C 98(这是Visual Studio 2008中唯一可用的标准)没有。

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

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

pp1确实是无效的,不必担心某事。

如果在地图中找不到密钥,则插入的值是值initialized(§23.4.4.3/1)。因此不需要包装纸;插入的指针将是无效的指针。

最新更新