如何拥有 unordered_multimap 个 unordered_multimap 秒
How to have an unordered_multimap of unordered_multimaps
我在练习 unordered_multimaps 时遇到了一个问题,即 unordered_multimap 包含另一个 unordered_multimap.The 编译器抛出一个错误,说 c++ 标准不提供此 type.I 猜想我必须写一个散列函数,但我的理解是有限的,因为我是 STL 的新手。
我已经尝试过向 unordered_multimap 插入一个结构或另一个多重映射,但到目前为止没有成功。
std::unordered_multimap<long,long>m_Map1;
std::unordered_multimap<CString,m_Map1>m_Map2; //This line throws
error
//inserting to the map
m_Map1.insert(std::pair<long,long>(10,20));
m_Map2.insert(_T("ABC"),m_Map1);
//also the compiler does not let me create an object for this map
m_Map1 m_ObjMap; //error here as well
我应该如何实现 this.What 我想在这里实现的是一个人的姓名与出生日期和日期相关联,他 dies.I 希望将日期放在一张地图中并将其映射到m_Map2.
的名称
您的问题是 std::hash
没有可用于 CString
的专业化
将问题归结为最简单的部分,这也无法编译:
std::unordered_multimap<CString , int> m_Map2;
因为 std::unordered_multimap<CString, anything>
需要存在 class std::hash<CString>
提供 std::size_t operator()(CString const&) const
(它还需要 std::equal_to<CString>
的实现,但这是自动可用的如果 CString
支持 operator==
.
您可以创建这样一个 class 并将其合法地注入到 std 命名空间中:
#include <unordered_map>
#include <boost/functional/hash.hpp> // for boost::hash_range, see below
// for exposition
struct CString
{
const char* data() const;
std::size_t length() const;
bool operator==(CString const& other) const;
};
namespace std
{
// specialise std::hash for type ::CString
template<> struct hash<::CString>
{
std::size_t operator()(CString const& arg) const
{
std::size_t seed = 0;
// perform whatever is your hashing function on arg here
// accumulating the hash into the variable seed
// in this case, we're doing it in terms of boost::hash_range
auto first = arg.data();
auto last = first + arg.length();
boost::hash_range(seed, first, last);
return seed;
}
};
}
std::unordered_multimap<CString , int> m_Map2;
我在练习 unordered_multimaps 时遇到了一个问题,即 unordered_multimap 包含另一个 unordered_multimap.The 编译器抛出一个错误,说 c++ 标准不提供此 type.I 猜想我必须写一个散列函数,但我的理解是有限的,因为我是 STL 的新手。
我已经尝试过向 unordered_multimap 插入一个结构或另一个多重映射,但到目前为止没有成功。
std::unordered_multimap<long,long>m_Map1;
std::unordered_multimap<CString,m_Map1>m_Map2; //This line throws
error
//inserting to the map
m_Map1.insert(std::pair<long,long>(10,20));
m_Map2.insert(_T("ABC"),m_Map1);
//also the compiler does not let me create an object for this map
m_Map1 m_ObjMap; //error here as well
我应该如何实现 this.What 我想在这里实现的是一个人的姓名与出生日期和日期相关联,他 dies.I 希望将日期放在一张地图中并将其映射到m_Map2.
的名称您的问题是 std::hash
没有可用于 CString
将问题归结为最简单的部分,这也无法编译:
std::unordered_multimap<CString , int> m_Map2;
因为 std::unordered_multimap<CString, anything>
需要存在 class std::hash<CString>
提供 std::size_t operator()(CString const&) const
(它还需要 std::equal_to<CString>
的实现,但这是自动可用的如果 CString
支持 operator==
.
您可以创建这样一个 class 并将其合法地注入到 std 命名空间中:
#include <unordered_map>
#include <boost/functional/hash.hpp> // for boost::hash_range, see below
// for exposition
struct CString
{
const char* data() const;
std::size_t length() const;
bool operator==(CString const& other) const;
};
namespace std
{
// specialise std::hash for type ::CString
template<> struct hash<::CString>
{
std::size_t operator()(CString const& arg) const
{
std::size_t seed = 0;
// perform whatever is your hashing function on arg here
// accumulating the hash into the variable seed
// in this case, we're doing it in terms of boost::hash_range
auto first = arg.data();
auto last = first + arg.length();
boost::hash_range(seed, first, last);
return seed;
}
};
}
std::unordered_multimap<CString , int> m_Map2;