由於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[]
返回哪些內容需要密鑰,並在給定密鑰有多個值時返回值。我沒有想過這麼多,但是我認爲它可以返回一個迭代器,它可以用來遍歷鍵的值。
['std :: unordered_multimap'](http://en.cppreference.com/w/cpp/container/unordered_multimap)? –