扩展哈希图
Extended Hashmaps
所以我一直在搜索C++论坛,并没有真正找到解决方案。我正在尝试创建具有以下详细信息的扩展哈希图:能够存储实数或字符串的值。能够存储实数或字符串的密钥。能够为每个键存储多个条目(值)。
结果的示例外观:
键:"键" -->值:0,5,"45","66"。
键:55 -->值:"哟",27,"67",88。
如您所见,我希望创建一个哈希图,我可以在其中将密钥存储为实数或字符串+能够将多个键存储为实数或每个键的字符串。
如果你对boost不过敏,你可能想看看boost::variant。可以使用 boost::variant<double, std::string>
作为哈希多重映射中的键和值类型,也可以使用 std::vector<boost::variant<double, std::string>>
作为哈希映射中的值类型。
在其其他优点(如类型安全)中,只要boost::variant
类型的所有成员类型都是可哈希的(double
和std::string
都是可哈希的),因此您应该能够将它们用作哈希表中的键。
由于 C++ 是一种静态类型语言,因此您必须模板化为此创建的任何类,或者必须为键和值定义特定类型。 或者,您可以使用标准模板库中可用的内置map<T>
类型,但同样 - 没有办法在运行时将哪种类型用于map<T>
的模板参数。
不过,您可以使用双向地图之类的东西。 Boost有一个,这是我最近写的一个代码:
// 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.");
}
双向映射的优点是,您可以使用值或使用键访问值。 缺点(至少在我的代码中,但我想在 boost 类中也是如此)是它不允许每个键有多个值。 但是修改我的代码以允许这样做并不难。 您只需要修改 Insert()
方法,然后考虑应该从 operator[]
返回什么,如果给定键有多个值,则接受键并返回一个值。 我没有考虑太多,但在我的头顶上,我认为它可以返回一个迭代器,可用于迭代键的值。
- 使用哈希图进行相对排序
- 使用哈希图打印第一个重复元素;
- 我想使用哈希图打印非重复的数字;
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- 无法迭代哈希图C++
- 如何提升::序列化矢量的哈希图
- 什么更快,内联函数调用或哈希图查找
- 添加元素<字符串、指针>以提升无序哈希图
- 哈希图常规修改
- 更改哈希图的Qt信号
- 少量项目的哈希图
- 使用哈希图 c++ 查找最常用的单词
- 扩展哈希图
- 更改 std::p air 类型会影响哈希图
- c ++我可以在我的代码中将这样的向量新到哈希图中吗?
- 如何提高哈希图迭代的复杂性
- 自定义哈希图给出在 Linux 上使用 gcc 的编译错误
- 将数据并行添加到哈希图
- 哈希图实现:---哈希码
- C++、内存和数组.创建我自己的练习哈希图.内存中留下的意外数据