我应该把什么作为分配器传递给std::hash_map

What should I pass as allocator to a std::hash_map?

本文关键字:std hash map 什么 分配器 我应该      更新时间:2023-10-16

我创建了一个小类,并试图将其用作STL hash_map中的数据。大量的搜索让我知道我需要添加一些东西作为分配器,但是到目前为止,我还没有看到如何在我的类中使用STL中的默认分配器的示例。有人能帮我指给我看吗?我把我的类的简化版本放在下面。

class cwVariable {
public:
    cwVariable();
    template <typename T>
    cwVariable(T value)
    {
        stash = new byte[sizeof(T)];
        memcpy(stash, &value, sizeof(T));
    }
    template <typename T>
    void set(T value)
    {
        if (stash != 0) {
            memcpy(stash, &value, sizeof(T));
        }
    }
    template <typename T>
    T get()
    {
        T out;
        memcpy(&out, stash, sizeof(T));
        return out;
    }
    ~cwVariable();
private:
    void * stash = 0;
};

cwVariable::~cwVariable() {
    delete stash;
}

为了完整性:我使用Arduino 1.6.4工具链,来自Arduino端口的STL,目标是Arduino Mega 2560。在Visual Studio 2012中使用Visual Micro插件

补充道:我的实际代码处理的比上面更多,但只是C类型的字符串指针,而不是string。当我添加

时,跟踪开始了
std::hash_map<const char*, cwVariable> months; 

到我的代码,得到输出

cwVar.cpp.o:In function `std::hash_map<char const*, cwVariable, std::hash<char const*>,
std::equal_to<char const*>, std::allocator<cwVariable> >::operator[](char const* const&)'
stl_hash_map.h:cwVariable()' 
collect2.exe*:error: ld returned 1 exit status as the error.

这让我做了更多的研究,并让我担心分配器

您不需要分配器。这些是在您自己进行内存管理(例如,内存池)时使用的。您所需要的,而您的类所没有的,是一个工作的深层复制构造函数。相反,您的类具有免费的浅复制构造函数。这将复制指针本身,而不是指针的内容。

实际上,您的类并不包含知道如何复制构造实例的必要信息。解决这个问题的一种方法是将分配类型的大小存储为数据成员。复制构造函数将分配大小合适的stashmemcpy的源存储到新实例的新存储中。

一个更好的方法是使整个类成为一个类模板,这是针对您的设计的一个潜在问题。您对void*memcpy的使用可能会导致将来的问题。因此,您的类适用于POD类,但不能用于其他类。

如果您模板化整个类并将void* stash更改为T stash,那么免费的复制构造函数正是您想要的。如果将void* stash更改为T* stash,则必须提供一个复制构造函数,但这相当简单。在这两种情况下,您的get和set成员函数都是微不足道的,并且您的代码比当前的void* stash/memcpy实现更通用。

在hash_map中简单地使用类作为数据类型并不需要使用分配器。只有当您想为您的map实现特定的分配策略时,才需要allocator。