gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:21:29 27 4
gpt4 key购买 nike

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

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.

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

最佳答案

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

照原样,您的类不包含了解如何复制构造实例的必要信息。解决这个问题的一种方法是将分配类型的大小存储为数据成员。复制构造函数将分配一个大小合适的 stash 并将源存储分配给 memcpy 到新实例的新存储。

更好的方法是使整个类成为一个类模板,这可以解决您的设计的潜在问题。您对 void*memcpy 的使用会导致 future 出现问题。照原样,您的类(class)适用于 POD classes ,但仅此而已。

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

关于c++ - 我应该将什么作为分配器传递给 std::hash_map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315840/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com