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()
메서드를 수정 한 다음 에서 반환해야하는 것을 생각하면 키를 가져 와서 지정된 키에 대해 여러 값이있는 경우 값을 반환합니다. 이 점에 대해서는 많이 생각하지 않았지만 머리 꼭대기에서 키의 값을 반복하는 데 사용할 수있는 반복기를 반환 할 수 있다고 생각합니다.
['std :: unordered_multimap'] (http://en.cppreference.com/w/cpp/container/unordered_multimap)? –