Поскольку 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.");
}
Преимущества двунаправленных карт является то, что вы можете получить доступ к ключу, используя значение или значение с помощью ключа. Недостаток (по крайней мере, с моим кодом, но я думаю, что и с классом повышения) заключается в том, что он не позволяет использовать несколько значений для каждого ключа. Но это не составит труда изменить мой код, чтобы это разрешить. Вам просто нужно будет изменить метод Insert()
, а затем подумайте о том, что должно быть возвращено из operator[]
, которое берет ключ и возвращает значение, если для данного ключа имеется несколько значений. Я не так много думал об этом, но, с моей точки зрения, он мог бы вернуть итератор, который можно было бы использовать для повторения значений ключа.
['std :: unordered_multimap'] (http://en.cppreference.com/w/cpp/container/unordered_multimap)? –