gpt4 book ai didi

boost - C++ : shared_ptr as unordered_set's key

转载 作者:行者123 更新时间:2023-12-01 09:36:43 29 4
gpt4 key购买 nike

考虑下面的代码

#include <boost/unordered_set.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

int main()
{
boost::unordered_set<int> s;
s.insert(5);
s.insert(5);
// s.size() == 1

boost::unordered_set<boost::shared_ptr<int> > s2;
s2.insert(boost::make_shared<int>(5));
s2.insert(boost::make_shared<int>(5));
// s2.size() == 2
}

问题是:为什么 s2 的大小是 2 而不是 1?我很确定它一定与哈希函数有关。我尝试查看 boost 文档并在没有运气的情况下使用哈希函数。

想法?

最佳答案

make_shared分配一个新的 int , 并包装 shared_ptr周围。这意味着您的两个 shared_ptr<int> s 指向不同的内存,并且由于您正在创建一个以指针值为键的哈希表,因此它们是不同的键。

出于同样的原因,这将导致大小为 2:

boost::unordered_set<int *> s3;
s3.insert(new int(5));
s3.insert(new int(5));
assert(s3.size() == 2);

在大多数情况下,您可以考虑shared_ptr s 就像指针一样工作,包括比较,除了自动销毁。

您可以定义自己的哈希函数和比较谓词,并将它们作为模板参数传递给 unordered_map ,但是:

struct your_equality_predicate
: std::binary_function<boost::shared_ptr<int>, boost::shared_ptr<int>, bool>
{
bool operator()(boost::shared_ptr<int> i1, boost::shared_ptr<int> i2) const {
return *i1 == *i2;
}
};

struct your_hash_function
: std::unary_function<boost::shared_ptr<int>, std::size_t>
{
std::size_t operator()(boost::shared_ptr<int> x) const {
return *x; // BAD hash function, replace with somethign better!
}
};

boost::unordered_set<int, your_hash_function, your_equality_predicate> s4;

但是,出于以下几个原因,这可能不是一个好主意:

  1. 您遇到了令人困惑的情况,其中 x != y但是 s4[x]s4[y]是一样的。
  2. 如果有人改变了哈希键所指向的值你的哈希值会被破坏!那就是:

    boost::shared_ptr<int> tmp(new int(42));
    s4[tmp] = 42;
    *tmp = 24; // UNDEFINED BEHAVIOR

通常使用哈希函数,您希望 key 是不可变的;无论以后发生什么,它总是比较相同。如果您使用指针,您通常希望指针标识是匹配的,如 extra_info_hash[&some_object] = ... ;这通常总是映射到相同的哈希值 some_object的成员可能是。插入后键是可变的,实际上这样做太容易了,从而导致哈希中的未定义行为。

关于boost - C++ : shared_ptr as unordered_set's key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6404765/

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