0

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

结果的示例外观:

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

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

正如你所看到的,我正在寻找一个哈希图,我可以将一个键存储为实数或字符串+能够将多个键存储为实数或每个键的字符串。

4

2 回答 2

0

由于 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[]哪个返回一个键,如果给定键有多个值,则返回一个值。我没有考虑这么多,但在我的脑海中,我认为它可以返回一个迭代器,该迭代器可用于迭代键的值。

于 2013-11-14T23:00:11.610 回答
0

如果你对 boost 不过敏,你可能想看看boost::variant。您可以boost::variant<double, std::string>在哈希多重映射中用作键类型和值类型,也可以在哈希映射中std::vector<boost::variant<double, std::string>>用作值类型。

在它的其他优点(如类型安全)中,一个boost::variant类型是可散列的,只要它的所有成员类型都是可散列的(并且两者double都是std::string),因此您应该能够将它们用作散列表中的键。

于 2013-11-14T23:10:13.863 回答