事情是这样的,
今天在编译的时候报错,很长,报错的地方是std::unordered_map的insert操作,但换成stdmap就没问题,
大概是跟std::unordered_map和std::pair有关,我截取几段,
error: no matching function for call to ‘std::pair<key, std::_List_iterator<long long int> >::pair(const key&, std::_List_iterator<long long int>&)’
return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));
error: no matching function for call to ‘std::unordered_map<long long int, std::pair<key, std::_List_iterator<long long int> > >::insert(std::pair<long long int, std::pair<key, std::_List_iterator<long long int> > >)’
auto res_pair = xxx.insert(std::make_pair(key,std::make_pair(key,value)));
报错的原因是,
std::map底层数据结构是红黑树,
std::unordered_map底层是hash,
而unordered_map没有专门的hash提供给std::pair,
所以一定要用std::pair的话,把unordered_map换成map,不考虑排序的话损失些性能。
或者给std::pair传如一个hash结构。
// unordered_map源码
template<class _Key, class _Tp,
class _Hash = hash<_Key>,
class _Pred = std::equal_to<_Key>,
class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
class unordered_map
{
。。。。。
}
自己定一个hash结构,然后传给std::pair
struct pair_hash
{
template <class T1, class T2>
std::size_t operator() (const std::pair<T1, T2> &pair) const
{
return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
}
};
int main()
{
std::unordered_map<std::pair<sd::string, std::string>, int, pair_hash> map_pair;
}
或用booost库:boost::hash<>
typedef std::pair<std::string,std::string> self_pair;
std::unordered_map<self_pair,int,boost::hash<self_pair>> unordered_map;