次のコードをコンパイルすると、ハッシュに関連するエラーが表示されました。
int F_no_meaningA(unordered_set<vector<int>>& setVec, vector<int>& vec)
{
setVec.insert(vec);
return 1;
}
int main()
{
vector<int> W{2, 3, 7};
unordered_set<vector<int>> setVec;
}
$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
$ g++ $1.cpp -o $1 -g -Wall -Weffc++ -pedantic -std=c++0x
/tmp/ccCQFQ4N.o: 関数内 `std::__detail::_Hash_code_base
, std::vector >, std::_Identity > >, std::equal_to > >, std::hash > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_hash_code( std::vector > const&) const': /usr/include/c++/4.6/bits/hashtable_policy.h:753:
std::hash<std::vector<int, std::allocator<int> > ::operator()(std::vector<int, std::allocator<int> >) const' /tmp/ccCQFQ4N.o: In function
std::__detail::_Hash_code_base への未定義参照、std::vector >、std::_Identity > > , std::equal_to > >, std::hash > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node >, false> const* , unsigned int) const': /usr/include/c++/4.6/bits/hashtable_policy.h:763: `std::hash > ::operator()(std::vector >) const' collect2: ld への未定義参照1 つの終了ステータスを返しました
そこで、以下の独自の Hash を導入して問題を解決します。
質問 1 > に対して独自のハッシュを提供する必要があるのはstd::unordered_set
いつですか? に対して独自の等価関数を提供する必要があるのはいつstd::unordered_set
ですか?
struct HashVector : unary_function<vector<int>, vector<int>::size_type> {
vector<int>::size_type operator()(const vector<int>& vec) const {
vector<int>::size_type sum = 0;
for(int i : vec) {
sum = sum*37 + hash<int>()(i);
}
return sum;
}
};
int F_no_meaningB(unordered_set<vector<int>, HashVector>& setVec, vector<int>& vec)
{
setVec.insert(vec);
return 1;
}
int main()
{
vector<int> W{2, 3, 7};
unordered_set<vector<int>, HashVector> setVec;
}
警告: 基本クラス 'struct std::unary_function, unsigned int>' に非仮想デストラクタ [-Weffc++] があります
質問 2 > g++ が構造体 HashVector について上記の警告を表示するのはなぜですか?
ありがとうございました