背景
最近在做项目的过程中,遇到使用unordered_set 使用的一个bug,这里简单来记录一下。
例子
#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <unordered_map>
#include <cmath>
#include <unordered_set>using namespace std;int main(int argc,char* argv[])
{//set<vector<int>> result;//unordered_map<vector<int>,int> result;unordered_set<vector<int>> result;return 0;
}
编译上述代码会产生以下错误。
test.cpp: In function ‘int main(int, char**)’:
test.cpp:18:32: error: use of deleted function ‘std::unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set() [with _Value = std::vector<int>; _Hash = std::hash<std::vector<int> >; _Pred = std::equal_to<std::vector<int> >; _Alloc = std::allocator<std::vector<int> >]’18 | unordered_set<vector<int>> result;| ^~~~~~
In file included from /usr/include/c++/11/unordered_set:47,from test.cpp:10:
/usr/include/c++/11/bits/unordered_set.h:135:7: note: ‘std::unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set() [with _Value = std::vector<int>; _Hash = std::hash<std::vector<int> >; _Pred = std::equal_to<std::vector<int> >; _Alloc = std::allocator<std::vector<int> >]’ is implicitly deleted because the default definition would be ill-formed:135 | unordered_set() = default;| ^~~~~~~~~~~~~
/usr/include/c++/11/bits/unordered_set.h:135:7: error: use of deleted function ‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_Hashtable() [with _Key = std::vector<int>; _Value = std::vector<int>; _Alloc = std::allocator<std::vector<int> >; _ExtractKey = std::__detail::_Identity; _Equal = std::equal_to<std::vector<int> >; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, true, true>]’
In file included from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable.h:528:7: note: ‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_Hashtable() [with _Key = std::vector<int>; _Value = std::vector<int>; _Alloc = std::allocator<std::vector<int> >; _ExtractKey = std::__detail::_Identity; _Equal = std::equal_to<std::vector<int> >; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, true, true>]’ is implicitly deleted because the default definition would be ill-formed:528 | _Hashtable() = default;| ^~~~~~~~~~
/usr/include/c++/11/bits/hashtable.h:528:7: error: use of deleted function ‘std::__detail::_Hashtable_base<_Key, _Value, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _Traits>::_Hashtable_base() [with _Key = std::vector<int>; _Value = std::vector<int>; _ExtractKey = std::__detail::_Identity; _Equal = std::equal_to<std::vector<int> >; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _Traits = std::__detail::_Hashtable_traits<true, true, true>]’
In file included from /usr/include/c++/11/bits/hashtable.h:35,from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable_policy.h:1604:7: note: ‘std::__detail::_Hashtable_base<_Key, _Value, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _Traits>::_Hashtable_base() [with _Key = std::vector<int>; _Value = std::vector<int>; _ExtractKey = std::__detail::_Identity; _Equal = std::equal_to<std::vector<int> >; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _Traits = std::__detail::_Hashtable_traits<true, true, true>]’ is implicitly deleted because the default definition would be ill-formed:1604 | _Hashtable_base() = default;| ^~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1604:7: error: use of deleted function ‘std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Hash, _RangeHash, _Unused, __cache_hash_code>::_Hash_code_base() [with _Key = std::vector<int>; _Value = std::vector<int>; _ExtractKey = std::__detail::_Identity; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; bool __cache_hash_code = true]’
/usr/include/c++/11/bits/hashtable_policy.h: In instantiation of ‘std::__detail::_Hashtable_ebo_helper<_Nm, _Tp, true>::_Hashtable_ebo_helper() [with int _Nm = 1; _Tp = std::hash<std::vector<int> >]’:
/usr/include/c++/11/bits/hashtable_policy.h:1210:7: required from here
/usr/include/c++/11/bits/hashtable_policy.h:1127:49: error: use of deleted function ‘std::hash<std::vector<int> >::hash()’1127 | _Hashtable_ebo_helper() noexcept(noexcept(_Tp())) : _Tp() { }| ^~~~~
In file included from /usr/include/c++/11/string_view:42,from /usr/include/c++/11/bits/basic_string.h:48,from /usr/include/c++/11/string:55,from /usr/include/c++/11/bits/locale_classes.h:40,from /usr/include/c++/11/bits/ios_base.h:41,from /usr/include/c++/11/ios:42,from /usr/include/c++/11/ostream:38,from /usr/include/c++/11/iostream:39,from test.cpp:1:
/usr/include/c++/11/bits/functional_hash.h:102:12: note: ‘std::hash<std::vector<int> >::hash()’ is implicitly deleted because the default definition would be ill-formed:102 | struct hash : __hash_enum<_Tp>| ^~~~
/usr/include/c++/11/bits/functional_hash.h:102:12: error: no matching function for call to ‘std::__hash_enum<std::vector<int>, false>::__hash_enum()’
/usr/include/c++/11/bits/functional_hash.h:83:7: note: candidate: ‘std::__hash_enum<_Tp, <anonymous> >::__hash_enum(std::__hash_enum<_Tp, <anonymous> >&&) [with _Tp = std::vector<int>; bool <anonymous> = false]’83 | __hash_enum(__hash_enum&&);| ^~~~~~~~~~~
/usr/include/c++/11/bits/functional_hash.h:83:7: note: candidate expects 1 argument, 0 provided
/usr/include/c++/11/bits/functional_hash.h:102:12: error: ‘std::__hash_enum<_Tp, <anonymous> >::~__hash_enum() [with _Tp = std::vector<int>; bool <anonymous> = false]’ is private within this context102 | struct hash : __hash_enum<_Tp>| ^~~~
/usr/include/c++/11/bits/functional_hash.h:84:7: note: declared private here84 | ~__hash_enum();| ^
In file included from /usr/include/c++/11/bits/hashtable.h:35,from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable_policy.h:1210:7: note: ‘std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Hash, _RangeHash, _Unused, __cache_hash_code>::_Hash_code_base() [with _Key = std::vector<int>; _Value = std::vector<int>; _ExtractKey = std::__detail::_Identity; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; bool __cache_hash_code = true]’ is implicitly deleted because the default definition would be ill-formed:1210 | _Hash_code_base() = default;| ^~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1210:7: error: use of deleted function ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::vector<int> >, true>::~_Hashtable_ebo_helper()’
/usr/include/c++/11/bits/hashtable_policy.h:1124:12: note: ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::vector<int> >, true>::~_Hashtable_ebo_helper()’ is implicitly deleted because the default definition would be ill-formed:1124 | struct _Hashtable_ebo_helper<_Nm, _Tp, true>| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1124:12: error: use of deleted function ‘std::hash<std::vector<int> >::~hash()’
In file included from /usr/include/c++/11/string_view:42,from /usr/include/c++/11/bits/basic_string.h:48,from /usr/include/c++/11/string:55,from /usr/include/c++/11/bits/locale_classes.h:40,from /usr/include/c++/11/bits/ios_base.h:41,from /usr/include/c++/11/ios:42,from /usr/include/c++/11/ostream:38,from /usr/include/c++/11/iostream:39,from test.cpp:1:
/usr/include/c++/11/bits/functional_hash.h:102:12: note: ‘std::hash<std::vector<int> >::~hash()’ is implicitly deleted because the default definition would be ill-formed:102 | struct hash : __hash_enum<_Tp>| ^~~~
/usr/include/c++/11/bits/functional_hash.h:102:12: error: ‘std::__hash_enum<_Tp, <anonymous> >::~__hash_enum() [with _Tp = std::vector<int>; bool <anonymous> = false]’ is private within this context
/usr/include/c++/11/bits/functional_hash.h:84:7: note: declared private here84 | ~__hash_enum();| ^
In file included from /usr/include/c++/11/bits/hashtable.h:35,from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable_policy.h:1604:7: error: use of deleted function ‘std::__detail::_Hash_code_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::~_Hash_code_base()’1604 | _Hashtable_base() = default;| ^~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1188:12: note: ‘std::__detail::_Hash_code_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::~_Hash_code_base()’ is implicitly deleted because the default definition would be ill-formed:1188 | struct _Hash_code_base| ^~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1188:12: error: use of deleted function ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::vector<int> >, true>::~_Hashtable_ebo_helper()’
In file included from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable.h:528:7: error: use of deleted function ‘std::__detail::_Hashtable_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::equal_to<std::vector<int> >, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, true, true> >::~_Hashtable_base()’528 | _Hashtable() = default;| ^~~~~~~~~~
In file included from /usr/include/c++/11/bits/hashtable.h:35,from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable_policy.h:1561:12: note: ‘std::__detail::_Hashtable_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::equal_to<std::vector<int> >, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, true, true> >::~_Hashtable_base()’ is implicitly deleted because the default definition would be ill-formed:1561 | struct _Hashtable_base| ^~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1561:12: error: use of deleted function ‘std::__detail::_Hash_code_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::~_Hash_code_base()’
In file included from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable.h:528:7: error: use of deleted function ‘constexpr std::_Enable_default_constructor<false, _Tag>::_Enable_default_constructor() [with _Tag = std::__detail::_Hash_node_base]’528 | _Hashtable() = default;| ^~~~~~~~~~
In file included from /usr/include/c++/11/bits/hashtable.h:36,from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/enable_special_members.h:113:15: note: declared here113 | constexpr _Enable_default_constructor() noexcept = delete;| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable.h: In instantiation of ‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::~_Hashtable() [with _Key = std::vector<int>; _Value = std::vector<int>; _Alloc = std::allocator<std::vector<int> >; _ExtractKey = std::__detail::_Identity; _Equal = std::equal_to<std::vector<int> >; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, true, true>]’:
/usr/include/c++/11/bits/unordered_set.h:97:11: required from here
/usr/include/c++/11/bits/hashtable.h:1534:5: error: use of deleted function ‘std::__detail::_Hashtable_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::equal_to<std::vector<int> >, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, true, true> >::~_Hashtable_base()’1534 | }
看这一段报错,是没有进行初始化导致的。
test.cpp: In function ‘int main(int, char**)’:
test.cpp:18:32: error: use of deleted function ‘std::unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set() [with _Value = std::vector<int>; _Hash = std::hash<std::vector<int> >; _Pred = std::equal_to<std::vector<int> >; _Alloc = std::allocator<std::vector<int> >]’18 | unordered_set<vector<int>> result;| ^~~~~~
In file included from /usr/include/c++/11/unordered_set:47,from test.cpp:10:
/usr/include/c++/11/bits/unordered_set.h:135:7: note: ‘std::unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set() [with _Value = std::vector<int>; _Hash = std::hash<std::vector<int> >; _Pred = std::equal_to<std::vector<int> >; _Alloc = std::allocator<std::vector<int> >]’ is implicitly deleted because the default definition would be ill-formed:135 | unordered_set() = default;
修改代码进行默认初始化,代码如下所示:
#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <unordered_map>
#include <cmath>
#include <unordered_set>using namespace std;int main(int argc,char* argv[])
{//set<vector<int>> result;//unordered_map<vector<int>,int> result;unordered_set<vector<int>> result(0);return 0;
}
这个时候,编译器没有红色下划线提示了。但是具体对代码进行编译,还是会报以下错误。
In file included from /usr/include/c++/11/unordered_set:47,from test.cpp:10:
/usr/include/c++/11/bits/unordered_set.h: In constructor ‘std::unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(std::unordered_set<_Value, _Hash, _Pred, _Alloc>::size_type, const hasher&, const key_equal&, const allocator_type&) [with _Value = std::vector<int>; _Hash = std::hash<std::vector<int> >; _Pred = std::equal_to<std::vector<int> >; _Alloc = std::allocator<std::vector<int> >; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::size_type = long unsigned int; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::hasher = std::hash<std::vector<int> >; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::key_equal = std::equal_to<std::vector<int> >; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::allocator_type = std::allocator<std::vector<int> >]’:
/usr/include/c++/11/bits/unordered_set.h:146:42: error: use of deleted function ‘std::hash<std::vector<int> >::hash()’146 | const hasher& __hf = hasher(),| ^~~~~~~~
In file included from /usr/include/c++/11/string_view:42,from /usr/include/c++/11/bits/basic_string.h:48,from /usr/include/c++/11/string:55,from /usr/include/c++/11/bits/locale_classes.h:40,from /usr/include/c++/11/bits/ios_base.h:41,from /usr/include/c++/11/ios:42,from /usr/include/c++/11/ostream:38,from /usr/include/c++/11/iostream:39,from test.cpp:1:
/usr/include/c++/11/bits/functional_hash.h:102:12: note: ‘std::hash<std::vector<int> >::hash()’ is implicitly deleted because the default definition would be ill-formed:102 | struct hash : __hash_enum<_Tp>| ^~~~
/usr/include/c++/11/bits/functional_hash.h:102:12: error: no matching function for call to ‘std::__hash_enum<std::vector<int>, false>::__hash_enum()’
/usr/include/c++/11/bits/functional_hash.h:83:7: note: candidate: ‘std::__hash_enum<_Tp, <anonymous> >::__hash_enum(std::__hash_enum<_Tp, <anonymous> >&&) [with _Tp = std::vector<int>; bool <anonymous> = false]’83 | __hash_enum(__hash_enum&&);| ^~~~~~~~~~~
/usr/include/c++/11/bits/functional_hash.h:83:7: note: candidate expects 1 argument, 0 provided
/usr/include/c++/11/bits/functional_hash.h:102:12: error: ‘std::__hash_enum<_Tp, <anonymous> >::~__hash_enum() [with _Tp = std::vector<int>; bool <anonymous> = false]’ is private within this context102 | struct hash : __hash_enum<_Tp>| ^~~~
/usr/include/c++/11/bits/functional_hash.h:84:7: note: declared private here84 | ~__hash_enum();| ^
test.cpp:18:40: note: when instantiating default argument for call to ‘std::unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(std::unordered_set<_Value, _Hash, _Pred, _Alloc>::size_type, const hasher&, const key_equal&, const allocator_type&) [with _Value = std::vector<int>; _Hash = std::hash<std::vector<int> >; _Pred = std::equal_to<std::vector<int> >; _Alloc = std::allocator<std::vector<int> >; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::size_type = long unsigned int; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::hasher = std::hash<std::vector<int> >; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::key_equal = std::equal_to<std::vector<int> >; std::unordered_set<_Value, _Hash, _Pred, _Alloc>::allocator_type = std::allocator<std::vector<int> >]’18 | unordered_set<vector<int>> result(0);| ^
In file included from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable.h: In instantiation of ‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::~_Hashtable() [with _Key = std::vector<int>; _Value = std::vector<int>; _Alloc = std::allocator<std::vector<int> >; _ExtractKey = std::__detail::_Identity; _Equal = std::equal_to<std::vector<int> >; _Hash = std::hash<std::vector<int> >; _RangeHash = std::__detail::_Mod_range_hashing; _Unused = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, true, true>]’:
/usr/include/c++/11/bits/unordered_set.h:97:11: required from here
/usr/include/c++/11/bits/hashtable.h:1534:5: error: use of deleted function ‘std::__detail::_Hashtable_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::equal_to<std::vector<int> >, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, true, true> >::~_Hashtable_base()’1534 | }| ^
In file included from /usr/include/c++/11/bits/hashtable.h:35,from /usr/include/c++/11/unordered_map:46,from /usr/include/c++/11/functional:61,from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,from /usr/include/c++/11/algorithm:74,from test.cpp:5:
/usr/include/c++/11/bits/hashtable_policy.h:1561:12: note: ‘std::__detail::_Hashtable_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::equal_to<std::vector<int> >, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, true, true> >::~_Hashtable_base()’ is implicitly deleted because the default definition would be ill-formed:1561 | struct _Hashtable_base| ^~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1561:12: error: use of deleted function ‘std::__detail::_Hash_code_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::~_Hash_code_base()’
/usr/include/c++/11/bits/hashtable_policy.h:1188:12: note: ‘std::__detail::_Hash_code_base<std::vector<int>, std::vector<int>, std::__detail::_Identity, std::hash<std::vector<int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::~_Hash_code_base()’ is implicitly deleted because the default definition would be ill-formed:1188 | struct _Hash_code_base| ^~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1188:12: error: use of deleted function ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::vector<int> >, true>::~_Hashtable_ebo_helper()’
/usr/include/c++/11/bits/hashtable_policy.h:1124:12: note: ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::vector<int> >, true>::~_Hashtable_ebo_helper()’ is implicitly deleted because the default definition would be ill-formed:1124 | struct _Hashtable_ebo_helper<_Nm, _Tp, true>| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/11/bits/hashtable_policy.h:1124:12: error: use of deleted function ‘std::hash<std::vector<int> >::~hash()’
In file included from /usr/include/c++/11/string_view:42,from /usr/include/c++/11/bits/basic_string.h:48,from /usr/include/c++/11/string:55,from /usr/include/c++/11/bits/locale_classes.h:40,from /usr/include/c++/11/bits/ios_base.h:41,from /usr/include/c++/11/ios:42,from /usr/include/c++/11/ostream:38,from /usr/include/c++/11/iostream:39,from test.cpp:1:
/usr/include/c++/11/bits/functional_hash.h:102:12: note: ‘std::hash<std::vector<int> >::~hash()’ is implicitly deleted because the default definition would be ill-formed:102 | struct hash : __hash_enum<_Tp>| ^~~~
/usr/include/c++/11/bits/functional_hash.h:102:12: error: ‘std::__hash_enum<_Tp, <anonymous> >::~__hash_enum() [with _Tp = std::vector<int>; bool <anonymous> = false]’ is private within this context
/usr/include/c++/11/bits/functional_hash.h:84:7: note: declared private here84 | ~__hash_enum();| ^
这个错误是因为 `std::unordered_set` 要求元素类型必须支持哈希,而 `std::vector<int>` 并没有默认的哈希函数。
解决方案一
自行为vector定义hash操作,如下代码:
#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <unordered_map>
#include <cmath>
#include <unordered_set>using namespace std;int main(int argc,char* argv[])
{//set<vector<int>> result;//unordered_map<vector<int>,int> result;struct VectorHash {size_t operator()(const std::vector<int>& v) const {std::hash<int> hasher;size_t seed = 0;for (int i : v) {seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);}return seed;}};unordered_set<vector<int>,VectorHash> result;return 0;
}
解决方案二
使用 `std::set` 代替 `std::unordered_set`,因为 `std::set` 不需要元素类型支持哈希。因为`std::set`底层是通过红黑树来实现的。std::unordered_set`底层是通过哈希表来实现的。代码如下所示:
#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <unordered_map>
#include <cmath>
#include <unordered_set>using namespace std;int main(int argc,char* argv[])
{//set<vector<int>> result;//unordered_map<vector<int>,int> result;set<vector<int>> result;return 0;
}