扩展的哈希映射

时间:2013-11-14 22:55:40

标签: c++ hashmap extend

所以我一直在C ++论坛上搜索,并没有真正找到解决方案。我正在尝试使用以下详细信息创建扩展的hashmap: 能够存储real或string的值。 能够存储真实或字符串的键。 能够为每个密钥存储多个条目(值)。

结果的示例外观:

key:“key” - >值:0,5,“45”,“66”。

键:55 - >价值:“哟”,27,“67”,88。

正如您所看到的,我希望创建一个hashmap,我可以将密钥存储为real或string +,可以将多个密钥存储为每个密钥的实数或字符串。

2 个答案:

答案 0 :(得分:0)

由于C ++是一种静态类型语言,因此您必须为您为此创建的任何类进行模板化,或者必须为键和值定义特定类型。或者,您可以使用标准模板库中提供的内置map<T>类型,但同样 - 无法检测您需要将哪种类型用于{{1}的模板参数在运行时。

但是,您可以使用类似双向地图的内容。 Boost有一个,这是我最近写的一个代码:

map<T>

双向映射的优点是您可以使用键使用值或值来访问键。缺点(至少在我的代码中,但我也想到了升级类)是它不允许每个键有多个值。但要修改我的代码并不难。您只需要修改// bimap.h #pragma once #include <string> #include <list> using namespace std; template <typename T0, typename T1> class bimap { public: bimap(){} bool Insert(T0, T1); void Clear(); T0& operator[](T1); T1& operator[](T0); private: list<pair<T0, T1>> m_dictionary; }; template<typename T0, typename T1> bool bimap<T0, T1>::Insert(T0 key, T1 value) { for (list<pair<T0, T1>>::const_iterator cur = m_dictionary.begin(); cur != m_dictionary.end(); cur++) { if ((*cur).first == key) return false; } m_dictionary.push_back(make_pair(key, value)); return true; } template<typename T0, typename T1> void bimap<T0, T1>::Clear() { m_dictionary.clear(); } template<typename T0, typename T1> T0& bimap<T0, T1>::operator[](T1 key) { for (list<pair<T0, T1>>::iterator cur = m_dictionary.begin(); cur != m_dictionary.end(); cur++) { if ((*cur).second == key) return (*cur).first; } throw new out_of_range("Key does not exist."); } template<typename T0, typename T1> T1& bimap<T0, T1>::operator[](T0 value) { for (list<pair<T0, T1>>::iterator cur = m_dictionary.begin(); cur != m_dictionary.end(); cur++) { if ((*cur).first == value) return (*cur).second; } throw new out_of_range("Value does not exist."); } 方法,然后考虑应该从Insert()返回什么,它接受一个键,如果给定键有多个值,则返回一个值。我没有想过这么多,但是我认为它可以返回一个迭代器,它可以用来迭代键的值。

答案 1 :(得分:0)

如果你对增强没有过敏,你可能想看看boost::variant。您可以将boost::variant<double, std::string>用作哈希多图中的键和值类型,或者可以使用std::vector<boost::variant<double, std::string>>作为哈希映射中的值类型。

在其他优点(如类型安全性)中,只要boost::variant类型的所有成员类型都可以清除(doublestd::string都是),{{1}}类型就是可清除的,所以你应该能够将它们用作哈希表中的键。