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

时间:2015-08-31 16:31:40

标签: c++ stl allocator

我创建了一个小类,并尝试将其用作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.

这让我的研究更多,让我担心分配器。

2 个答案:

答案 0 :(得分:2)

您不需要分配器。这些是您在进行自己的内存管理时(例如,内存池)。你需要什么,以及你的班级没有什么,是一个有效的深层复制构造函数。你的班级有免费的浅拷贝构造函数。这将复制指针而不是指针的内容。

按原样,您的类不包含必须知道如何复制构造实例的信息。解决此问题的一种方法是将分配的类型的大小存储为数据成员。复制构造函数将为新存储的新存储分配一个正确大小的stashmemcpy源存储。

更好的方法是使整个类成为一个类模板,这是在您的设计存在潜在问题之后。您对void*memcpy的使用是未来问题的一个方法。因此,您的班级适用于POD classes,但不是其他。

如果您对整个班级进行模板化并将void* stash更改为T stash,那么免费赠品复制构造函数就是您想要的。如果您将void* stash更改为T* stash,则必须提供复制构造函数,但这很简单。在这两种情况下,您的get和set成员函数都很简单,而且您的代码比当前void* stash / memcpy实现更通用。

答案 1 :(得分:0)

简单地将您的类用作hash_map中的数据类型不需要您拥有分配器。如果要为地图实施特定的分配策略,则只需要分配器。

相关问题