c++ - std::map 如何确保所有指针都为空?

标签 c++ stl std stdmap

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

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

在调试器对象中是 0x0000000,因此映射中的无效值始终为 null。但是,在我的映射中,无效值就像未初始化的指针 - 它们具有无效值,如 0xcdcdcdcd,但是在 Release 模式下它是另外一回事,所以我不能依赖检查

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 循环。是否有某种方法可以确保我在 map 初始化时想要什么,或者我有制作一个自定义 PointerWrapper,它将包含 SomeObject 的指针,在 PointerWrapper 的构造函数中设置为 nullptr ?我很难弄清楚 std header 中发生了什么,它们有大量的宏和 typedef。

最佳答案

如果您显式构造对象,您的值(对于任何类型)将被初始化

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

对于类,默认构造函数显然被调用了。

对于内置类型,如 int 和指针(如 SomeObject*),它们将被零初始化(而不是未初始化)

因此,虽然您可以在特定的指针示例中使用 = NULL,但像这样的语法将对所有类型 做正确的事。

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...
}

关于c++ - std::map 如何确保所有指针都为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711798/

相关文章:

c++ - 来自事件处理程序的 STM32 函数指针

c++ - while 循环提前结束

c++ - NSSet 与 unordered_set

c++ - log(n) std::find_if 可能吗?

c++ - 在C++中对 vector 的内容进行排序

c++ - 寻找 std::boyer_moore_searcher

c++ - VS2012 bind2nd 不是 std 的成员

c++ - std::vector<bool> 是如何声明/定义的?

c++ - 容器和 'iterable' 类的虚拟父级

c++ - 登录和 gdbus : Not getting notifications