make_shared
新しい を割り当て、それint
を a で囲みshared_ptr
ます。これは、2 つshared_ptr<int>
の s が異なる memoryを指していることを意味し、ポインター値をキーとするハッシュ テーブルを作成しているため、それらは別個のキーです。
同じ理由で、これは 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;
ただし、これはおそらくいくつかの理由で悪い考えです。
x != y
buts4[x]
とs4[y]
が同じという紛らわしい状況があります。
誰かがハッシュキーが指す値を変更した場合、あなたのハッシュは壊れます! あれは:
boost::shared_ptr<int> tmp(new int(42));
s4[tmp] = 42;
*tmp = 24; // UNDEFINED BEHAVIOR
通常、ハッシュ関数では、キーを不変にする必要があります。後で何が起こっても、常に同じものを比較します。ポインターを使用している場合は、通常、ポインターの ID を一致させる必要がありextra_info_hash[&some_object] = ...
ます。some_object
これは通常、のメンバーが何であれ、常に同じハッシュ値にマップされます。挿入後に変更可能なキーを使用すると、実際に変更するのが非常に簡単になり、ハッシュで未定義の動作が発生します。