2013-11-14 1 views
0

Так что я искал вокруг форумов C++ и на самом деле не нашел решения. Я пытаюсь создать расширенный hashmap со следующими данными: Возможность хранения значений реального или строкового. Возможность хранить ключи реального или строкового. Возможность хранения нескольких записей (значений) на ключ.Extended Hashmaps

В качестве примера вид результата:

ключ: "ключ" -> значение: 0,5, "45", "66".

ключ: 55 -> значение: "Yo", 27, "67", 88.

Как вы можете видеть, я ищу, чтобы создать хэш-карту, где я могу хранить ключ как реальный, так и string +, способный хранить несколько ключей как реальные, так и строковые на ключ.

+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(), а затем подумайте о том, что должно быть возвращено из operator[], которое берет ключ и возвращает значение, если для данного ключа имеется несколько значений. Я не так много думал об этом, но, с моей точки зрения, он мог бы вернуть итератор, который можно было бы использовать для повторения значений ключа.

+0

Ну, повышение требует времени для установки. Поэтому я попробую, когда все будет готово. Что касается карты идея, я рассмотрю это, поскольку в настоящее время я понятия не имею, что там происходит. До некоторых исследований. – FatalSleep

0

Если у вас нет аллергии на повышение, вы можете взглянуть на boost::variant. Вы можете использовать boost::variant<double, std::string> как ключ и тип значения в хеш-мультимаге, либо вы можете использовать std::vector<boost::variant<double, std::string>> как тип значения в хэш-карте.

Среди других его достоинств (например, типа-безопасность), boost::variant типа hashable, пока все его типов членов являются hashable (и оба double и std::string являются), так что вы должны быть в состоянии использовать их в качестве ключей в хэш-таблицу.

 Смежные вопросы

  • Нет связанных вопросов^_^