Есть ли общая версия HashTable? - PullRequest
0 голосов
/ 16 декабря 2009

Мне нужен класс, который будет работать как C ++ std :: map. Более конкретно мне нужно такое поведение:
map< string, vector<int> > my_map;
Возможно ли это?

Ответы [ 4 ]

12 голосов
/ 16 декабря 2009

Словарь - это я верю в то, что вы хотите:

Dictionary<String, int> dict = new Dictionary<String, int>();

dict.Add("key", 0);
Console.WriteLine(dict["key"]);

и т. Д. И т. П.

MSDN: http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

Вы можете указать более или менее любой тип в качестве типа ключ / значение. Включая другой словарь, массив или что-то еще:

Dictionary<String, String[]> dict = new Dictionary<String, String[]>();

Таким образом, здесь каждый элемент в Словаре указывает на массив строк.

Чтобы реализовать то, что вам нужно (с вектором int), вам потребуется List в качестве типа значения:

Dictionary<String, List<int>> dict = new Dictionary<String, List<int>>();

Стоит отметить, что в словаре нет предопределенного порядка, а в std :: map - нет. Если порядок важен, вы можете вместо этого использовать SortedDictionary, который почти идентичен в использовании, но сортирует по ключу. Все зависит от того, действительно ли вы планируете перебирать словарь.

Обратите внимание, однако, что если вы используете класс, который вы создали в качестве ключа, вам нужно будет правильно переопределить GetHashCode и Equals.

1 голос
/ 16 декабря 2009

Это зависит от того, что вам действительно нужно. Как уже было сказано, вы получаете поведение поиска, используя System.Collections.Generic.Dictionary<Key, Value>, поэтому эквивалент std::map<string, std::vector<int> > будет (используя System.Collections.Generic.List<int> как вектор-эквивалент):

Dictionary<string, List<int>> myDictionary = new Dictionary<string, List<int>>();
myDictionary.Add("a", new List<int>());

и т. Д. Внутренне Словарь использует Hashtable, в то время как std :: map использует Red-Black-Tree, поэтому std :: map упорядочен, а Dictionary неупорядочен. Если вам нужен упорядоченный словарь (который был бы ближе к std :: map, вы можете использовать System.Collections.Generic.SortedDictionary<Key, Value>. Использование в основном такое же, как в словаре

0 голосов
/ 16 декабря 2009

Если ваша цель - заменить карту, то вам нужен 'SortedDictionary', потому что он также реализует красно-черное дерево. Если вам нужна хеш-таблица, тогда будет работать словарь.

0 голосов
/ 16 декабря 2009

Да, заявление, которое вы написали в вопросе, является правильным. Он отображает строку на вектор целых. Однако std :: map опирается на реализацию красно-черного дерева, и ваш вопрос предполагает, что вам нужна хеш-таблица. Если вы можете использовать boost, вы можете попробовать их реализацию unordered_map. Это часть спецификации tr1 и реализует карту в виде хеш-таблицы. Хеш-функции для стандартных типов уже реализованы в boost, поэтому вам не нужно об этом беспокоиться.

#include <boost/unordered_map.hpp>
...
boost::unordered_map<std::string, std::vector<int> > my_map;
...