gpt4 book ai didi

c++ - unordered_set 使用值对象地址的散列

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:19 29 4
gpt4 key购买 nike

我有一个类需要一个 std::unordered_set它持有不可复制、不可移动的实体对象,并且其哈希函数对实例的地址进行哈希处理。类似于以下内容:

class A
{
public:
A();
A(const A&) = delete;
A(A&&) = delete;
void operator=(const A&) = delete;
void operator=(A&&) = delete;

bool operator==(const A& other) { return this == &other; }
};

template<>
struct std::hash<A>
{
size_t operator()(const A& obj) const
{
return std::hash<A*>()(&obj);
}
};

class B
{
private:
std::unordered_set<A> entities;
};

如果emplace()总是使用而不是 insert() , 使用安全吗 unordered_set这样?标准是否指定实现不能在构造节点对象后移动它们?

如果A呢?是可移动的?是否保证哈希函数将在集合拥有的对象上调用,或者因为标准库更喜欢将所有内容视为值对象,是否允许对 insert 进行哈希处理?在为它分配存储之前编辑对象?

作为最后的想法,我知道我可以通过使用 std::unordered_set<std::unique_ptr<A>> 来解决所有这些问题,但我想为 A 使用自定义分配器对象,我不想覆盖 newdelete对于 A .

最佳答案

使用对象的地址作为散列几乎可以保证您找不到该对象,除非您已经持有指向该对象的指针,而不是通过散列进行迭代。您需要想出一种不同的方法来从您的对象中获取哈希值。也就是说,一旦在散列内部构建,对象的地址就不会改变。

关于c++ - unordered_set 使用值对象地址的散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19347862/

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