c ++ 11,为什么为vector <int>定义的unordered_map不起作用?

时间:2017-04-03 17:32:03

标签: c++ c++11

我正在尝试创建#include <bits/stdc++.h> using namespace std; class mhash { public: std::size_t operator()(std::vector<int> const& vec) const { std::size_t seed = vec.size(); for(auto& i : vec) { seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2); } return seed; } }; map <vector <int>,int, mhash> M; int main(){ vector <int> V; M[V]=5; cout << M[V]; } 。我知道我需要拥有自己的哈希函数,所以我尝试构建一个。我能够创建它并编译它很好,但是当我尝试访问它时会出现编译错误。

以下是代码:

g++ -std=c++11

我正在使用unordered_map进行编译。

如果我只声明In file included from /usr/include/c++/5/map:61:0, from /usr/include/x86_64-linux-gnu/c++/5/bits/stdc++.h:80, from exp.cpp:1: /usr/include/c++/5/bits/stl_map.h: In instantiation of ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = std::vector<int>; _Tp = int; _Compare = mhash; _Alloc = std::allocator<std::pair<const std::vector<int>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::vector<int>]’: exp.cpp:19:5: required from here /usr/include/c++/5/bits/stl_map.h:481:32: error: no match for call to ‘(std::map<std::vector<int>, int, mhash>::key_compare {aka mhash}) (const key_type&, const std::vector<int>&)’ if (__i == end() || key_comp()(__k, (*__i).first)) ^ exp.cpp:6:15: note: candidate: std::size_t mhash::operator()(const std::vector<int>&) const std::size_t operator()(std::vector<int> const& vec) const { ^ exp.cpp:6:15: note: candidate expects 1 argument, 2 provided In file included from /usr/include/c++/5/map:60:0, from /usr/include/x86_64-linux-gnu/c++/5/bits/stdc++.h:80, from exp.cpp:1: /usr/include/c++/5/bits/stl_tree.h: In instantiation of ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_lower_bound(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type, const _Key&) [with _Key = std::vector<int>; _Val = std::pair<const std::vector<int>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::vector<int>, int> >; _Compare = mhash; _Alloc = std::allocator<std::pair<const std::vector<int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::vector<int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type = std::_Rb_tree_node<std::pair<const std::vector<int>, int> >*]’: /usr/include/c++/5/bits/stl_tree.h:1091:30: required from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = std::vector<int>; _Val = std::pair<const std::vector<int>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::vector<int>, int> >; _Compare = mhash; _Alloc = std::allocator<std::pair<const std::vector<int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::vector<int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::key_type = std::vector<int>]’ /usr/include/c++/5/bits/stl_map.h:916:36: required from ‘std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = std::vector<int>; _Tp = int; _Compare = mhash; _Alloc = std::allocator<std::pair<const std::vector<int>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::vector<int>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::vector<int>]’ /usr/include/c++/5/bits/stl_map.h:479:28: required from ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = std::vector<int>; _Tp = int; _Compare = mhash; _Alloc = std::allocator<std::pair<const std::vector<int>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::vector<int>]’ exp.cpp:19:5: required from here /usr/include/c++/5/bits/stl_tree.h:1628:6: error: no match for call to ‘(mhash) (const std::vector<int>&, const std::vector<int>&)’ if (!_M_impl._M_key_compare(_S_key(__x), __k)) ^ exp.cpp:6:15: note: candidate: std::size_t mhash::operator()(const std::vector<int>&) const std::size_t operator()(std::vector<int> const& vec) const { ^ exp.cpp:6:15: note: candidate expects 1 argument, 2 provided 它编译得很好,但是当我尝试使用它时,我会收到以下错误:

"Sequence of numbers up to iteration number: "+5+"0.01"

2 个答案:

答案 0 :(得分:2)

您编写了地图,而不是unordered_map。

但是......如果你想要地图 map 的第三个模板参数不是哈希值,而是比较器。 bool operator()(a,b)

答案 1 :(得分:1)

因为您实例化了std::map,而不是std::unordered_map

法线贴图不接受散列函数。

据推测,这只是一个错字。

顺便说一句,avoid #include <bits/stdc++.h>