我应该把什么作为分配器传递给std::hash_map
What should I pass as allocator to a std::hash_map?
我创建了一个小类,并试图将其用作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.
这让我做了更多的研究,并让我担心分配器
您不需要分配器。这些是在您自己进行内存管理(例如,内存池)时使用的。您所需要的,而您的类所没有的,是一个工作的深层复制构造函数。相反,您的类具有免费的浅复制构造函数。这将复制指针本身,而不是指针的内容。
实际上,您的类并不包含知道如何复制构造实例的必要信息。解决这个问题的一种方法是将分配类型的大小存储为数据成员。复制构造函数将分配大小合适的stash
和memcpy
的源存储到新实例的新存储中。
一个更好的方法是使整个类成为一个类模板,这是针对您的设计的一个潜在问题。您对void*
和memcpy
的使用可能会导致将来的问题。因此,您的类适用于POD类,但不能用于其他类。
如果您模板化整个类并将void* stash
更改为T stash
,那么免费的复制构造函数正是您想要的。如果将void* stash
更改为T* stash
,则必须提供一个复制构造函数,但这相当简单。在这两种情况下,您的get和set成员函数都是微不足道的,并且您的代码比当前的void* stash
/memcpy
实现更通用。
在hash_map中简单地使用类作为数据类型并不需要使用分配器。只有当您想为您的map实现特定的分配策略时,才需要allocator。
- C++std::hash实现总是确定性的吗
- std::hash for std::chrono::duration
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 错误:未使用不完整的类型'struct std::hash<>'无效
- 无法专门化 std::hash 以unordered_map存储自定义类型
- 为模板类嵌套类定义 std::hash 时出现编译错误
- Return value of std::hash ofr (x86/x64)
- STD :: HASH :: operator() - 例外保证
- STD :: HASH专业化仍然由STD :: Unordered_map未使用
- C++11:是否有理由为什么某些常规类型不应该专门使用“std::hash”
- 重新定义 std::hash 模板结构
- 为什么std::hash不专门用于std::reference_wrapper
- std::hash 是否保证在 stdlib 发行版中相同
- 专门针对类满足条件的“std::hash”
- 如何使用 std::hash 对缓冲区进行哈希处理
- 为类模板的枚举成员定义 std::hash
- 无法对指向成员使用 std::hash 的专用化
- c++11 std::hash函数对象类的线程安全性
- 我可以重写std::hash吗
- const和nonconst类型的部分std::hash专用化