1

我正在实现一个类似于 std 的自定义地图类,但是我有一个问题。在他们的地图中,当你这样做时(例如):

map<string, SomeObject*> container;
SomeObject* object = container["this doesn't exist"];

在调试器对象中是0x0000000,因此映射中的无效值始终为空。但是,在我的映射中,无效值就像未初始化的指针 - 它们具有像0xcdcdcdcd这样的无效值,但是在发布模式下它是别的东西,所以我不能依赖检查为了

if(object == 0xcdcdcdcd)

所以我希望能够做到这一点:

MyMap<string, SomeObject*> container;
SomeObject* object = container["this doesn't exist"]; //and for this to definetely be nullptr

所以我可以这样做

if(object == nullptr)
   DoSomething();

我有一个bool ContainsKey(KeyType key); 函数,但它涉及一个 for 循环。是否有某种方法可以确保我在初始化时为地图提供什么,或者我是否必须制作一个自定义PointerWrapper,该指针将包含 SomeObject 的指针,该指针在PointerWrapper设置nullptr ' s 构造函数?我很难弄清楚 std 标头中发生了什么,它们有大量的宏和 typedef。

4

3 回答 3

3

std::mapvalue 初始化它在内部创建的任何新值。对于标量类型,这意味着它们被初始化为 0。

于 2013-03-29T21:40:17.417 回答
3

Your values (for any type) will be initialized if you explicitly construct the object

SomeObject* object = SomeObject*();
//                              ^^ Explicit construction

For classes, the default constructor is obviously being called.

For built-in types like ints and pointers (like SomeObject*), they will be zero-initialized (instead of uninitialized)

So, whileyou could use = NULL in your specific pointer example, syntax like this will do The Right Thing for all types.

template < typename Key, typename Value >
void MyMap<Key, Value> add_new_key( const Key &k )
{
   std::pair<Key, Value>( k, Value() );
//                                ^^ Either calls constructor or zero-initializes

   // Store the data as you wish...
}
于 2013-03-29T21:41:25.077 回答
2

使用 std::map 当您引用不存在的条目时,它会创建一个并将其值设置为空。对于意味着将值设置为 null 的指针;

于 2013-03-29T21:40:29.803 回答