2013-11-14 126 views
0

所以我一直在搜索C++論壇,並沒有真正找到解決方案。我正在嘗試創建一個擴展哈希表,其中包含以下詳細信息: 可以存儲real或string的值。 能夠存儲真實或字符串的鍵。 能夠存儲每個鍵的多個條目(值)。擴展哈希表

一個例子的外觀的結果的:

鍵: 「鍵」 - >值:0,5, 「45」, 「66」。

key:55 - > value:「Yo」,27,「67」,88。

正如你所看到的,我正在創建一個hashmap,我可以將key存儲爲real或string +能夠將多個key存儲爲real或每個key的字符串。

+1

['std :: unordered_multimap'](http://en.cppreference.com/w/cpp/container/unordered_multimap)? –

回答

0

由於C++是一種靜態類型語言,因此您必須爲此創建的任何類創建模板,或者必須爲該鍵和值定義特定類型。或者,您可以使用標準模板庫中提供的內置map<T>類型,但是又沒有辦法在運行時檢測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."); 
} 

雙向映射的好處是,你可以通過使用值或使用密鑰值訪問密鑰。不利的一面(至少在我的代碼中,但是我也可以用boost類來想象),它不允許每個鍵有多個值。但是修改我的代碼並不難。您只需修改Insert()方法,然後考慮如何從operator[]返回哪些內容需要密鑰,並在給定密鑰有多個值時返回值。我沒有想過這麼多,但是我認爲它可以返回一個迭代器,它可以用來遍歷鍵的值。

+0

好吧,增加需要很長時間才能安裝。所以我會在一切完成時嘗試一下。至於地圖的想法,我會研究,因爲我目前不知道那裏發生了什麼。下來做一些研究。 – FatalSleep

0

如果您對促進過敏不敏感,您可能需要查看boost::variant。您可以使用boost::variant<double, std::string>作爲散列多圖中的鍵和值類型,也可以使用std::vector<boost::variant<double, std::string>>作爲散列表中的值類型。

在它的其他優點(如類型安全),一個boost::variant類型是哈希的,只要它的所有成員類型都是可哈希(兩者doublestd::string是),所以你應該能夠使用它們作爲鍵一個哈希表。