c ++ 11:unordered_mapとペアの組み合わせの落とし穴

こんな感じ、

本日のコンパイル中にエラーが報告されました。非常に長いです。std:: ordered_mapの挿入操作でエラーが報告されますが、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の最下層はハッシュであり、

また、unordered_mapには、std :: pairに提供される特別なハッシュはありません。

したがって、std :: pairを使用する必要がある場合は、unordered_mapをmapに置き換えます。並べ替えを考慮しないと、パフォーマンスが低下します。

または、ハッシュ構造をstd :: pairに渡します。

// 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
{
    。。。。。
}

自分でハッシュ構造を設定し、それを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;
}

または、boostライブラリを使用します:boost :: hash <>

typedef std::pair<std::string,std::string> self_pair;
std::unordered_map<self_pair,int,boost::hash<self_pair>> unordered_map;

 

おすすめ

転載: blog.csdn.net/ynshi57/article/details/111561740