gpt4 book ai didi

c++ - 如何拥有 unordered_multimaps 的 unordered_multimap

转载 作者:行者123 更新时间:2023-11-28 01:18:54 26 4
gpt4 key购买 nike

我在练习 unordered_multimaps 时遇到了一个问题,一个 unordered_multimap 包含另一个 unordered_multimap。编译器抛出一个错误,说 c++ 标准不提供这种类型的散列。我想我必须写一个散列函数,但我的理解由于我是 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

我应该如何实现这一点。我在这里想要实现的是一个人的名字与出生日期和他去世的日期相关联。我希望在一张 map 中包含日期并将其与名称映射到 m_Map2。

最佳答案

你的问题是 std::hash 没有专门化适用于 CString

将问题归结为最简单的部分,这也不会编译:

std::unordered_multimap<CString , int> m_Map2;    

因为 std::unordered_multimap<CString, anything>要求存在一个类 std::hash<CString>它提供了std::size_t operator()(CString const&) const (它还需要 std::equal_to<CString> 的实现,但如果 CString 支持 operator==,它会自动可用。

您可以创建这样一个类并合法地将其注入(inject)到 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;

关于c++ - 如何拥有 unordered_multimaps 的 unordered_multimap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57589909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com