2009-12-16 21 views
0

我需要一个类似C++ std :: map的类。更具体地说,我需要这样的行为:
map< string, vector<int> > my_map;
这可能吗?是否有任何通用的HashTable?

+4

你需要用什么语言? – 2009-12-16 13:25:54

+2

@gf-我相信他是为C#拍摄的 – TStamper 2009-12-16 13:27:46

+0

我相信你的意思是std: :multimap KitsuneYMG 2009-12-16 13:31:30

回答

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中的每个元素指向一个字符串数组。

要实现您所需要的(与向量INT),您将需要一个列表作为值类型:

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

值得一提的是一个字典没有预定义的顺序,而性病::地图确实。如果顺序很重要,您可能希望使用SortedDictionary,这在用法上几乎相同,但按键排序。如果你打算真的迭代字典,这一切都取决于。

但是请注意,如果您使用您创建的类作为键,您将需要正确覆盖GetHashCode和Equals。

0

是的,你在问题中写的声明是正确的。它将一个字符串映射到一个整数矢量上。然而,std :: map由红黑树实现支持,而你的问题表明你需要一个散列表。如果你可以使用boost,你可以尝试执行unordered_map。这是tr1规范的一部分,并将映射实现为散列表。标准类型的散列函数已经在boost中实现,所以你不需要担心这一点。

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

我相信这个问题需要一个C#等价物,而不是C++代码是否准确 – Kazar 2009-12-16 13:26:22

+0

我没有看到问题中的C#标记。你可以让它更清楚一点,你是在一个c#相当于std :: map! – 2009-12-16 13:26:31

+0

我没有问这个问题,但我已经编辑了这个问题来澄清(假设我对这个问题的假设是正确的)。 – Kazar 2009-12-16 13:28:36

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的,而性病::地图使用红黑树,所以std :: map是有序的,而Dictionary是无序的。如果你需要一个有序的字典(这将更接近std :: map,你可以使用System.Collections.Generic.SortedDictionary<Key, Value>。它的用法大致相同,它的用法大致与字典

0

相同如果你的目标是要替换map,那么你想'SortedDictionary' ,因为那也实现了红黑树,如果你想要一个哈希表,那么Dictionary就可以工作了

相关问题