2013-11-14 4 views
0

그래서 C++ 포럼을 둘러보고 실제로 해결책을 찾지 못했습니다. 다음과 같은 세부 사항으로 확장 된 해시 맵을 생성하려고합니다 : 실제 또는 문자열 값을 저장할 수 있습니다. 실제 또는 문자열 키를 저장할 수 있습니다. 키당 여러 항목 (값)을 저장할 수 있습니다.확장 된 Hashmaps

결과의 예를 보면 :

키 "키"-> 값 : 0.5, "45", "66".

키 : 55 -> 값 : "Yo", 27, "67", 88.

당신이 볼 수 있듯이, 나는 실제 또는 문자열 + 키마다 실제 또는 문자열로 여러 개의 키를 저장할 수있는 키를 저장할 수있는 해시 맵을 만들려고합니다.

+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."); 
} 

양방향지도의 장점은 당신이 값 또는 키를 사용하여 값을 사용하여 키에 액세스 할 수 있다는 것입니다. 단점 (적어도 내 코드와 함께,하지만 부스트 클래스뿐만 아니라 상상)은 키 당 여러 값을 허용하지 않는다는 것입니다. 그러나 이것을 허용하도록 코드를 수정하는 것은 어렵지 않습니다. Insert() 메서드를 수정 한 다음 에서 반환해야하는 것을 생각하면 키를 가져 와서 지정된 키에 대해 여러 값이있는 경우 값을 반환합니다. 이 점에 대해서는 많이 생각하지 않았지만 머리 꼭대기에서 키의 값을 반복하는 데 사용할 수있는 반복기를 반환 할 수 있다고 생각합니다.

+0

글쎄, 부스트 설치 연령이 오래 걸립니다. 그래서 모든 것이 완료되면 그것을 시도해 보겠습니다. 지도에 관해서는 현재 내가 무슨 일이 일어나고 있는지 전혀 알지 못하기 때문에 그 부분을 살펴 보겠습니다. 아래로 약간 연구를하십시오. – FatalSleep

0

부스트에 알레르기가 없다면 boost::variant을 살펴볼 수 있습니다. 해시 다중 맵에서 boost::variant<double, std::string>을 키와 값 유형으로 사용할 수도 있고 해시 맵의 값 유형으로 std::vector<boost::variant<double, std::string>>을 사용할 수도 있습니다. 당신이 열쇠로 사용 할 수 있어야하므로,

(유형 안전 등)의 다른 장점 중

boost::variant 유형은 한 멤버 유형의 모든 해쉬만큼 해쉬 (그리고 모두 doublestd::string는) 해시 테이블