2009-12-16 2 views
0

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

+4

Вам нужно, чтобы на каком языке? –

+2

@ gf- Я считаю, что он стрелял по C# – TStamper

+0

Я считаю, вы имеете в виду std: : multimap KitsuneYMG

ответ

12

словарем Я считаю, что вы хотите:

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[]>(); 

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

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

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

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

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

0

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

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

Я считаю, что вопрос запрашивает эквивалент C#, а не точный код C++ – Kazar

+0

Я не видел тег C# в вопросе. Возможно, вы поняли, что после C# эквивалента std :: map! –

+0

Я не задавал вопрос, но я отредактировал вопрос, чтобы уточнить (предполагая, что мое предположение о правильном вопросе). – Kazar

1

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

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

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

0

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

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