我需要一个像C ++ std :: map一样的类。更具体地说,我需要这样的行为:
map< string, vector<int> > my_map;
有可能吗?
答案 0 :(得分: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中的每个元素都指向一个字符串数组。
要实现所需(使用vector int),您需要List作为值类型:
Dictionary<String, List<int>> dict = new Dictionary<String, List<int>>();
值得注意的是,Dictionary没有预定义的顺序,而std :: map则没有。如果订单很重要,您可能希望使用SortedDictionary,这在使用上几乎相同,但对密钥进行排序。如果你打算真的遍历字典,那一切都取决于。
但请注意,如果您使用自己创建的类作为键,则需要正确覆盖GetHashCode和Equals。
答案 1 :(得分: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使用Red-Black-Tree,因此std :: map是有序的,而Dictionary是无序的。如果你需要一个有序的字典(它更接近于std :: map,你可以使用System.Collections.Generic.SortedDictionary<Key, Value>
。用法与Dictionary的用法大致相同
答案 2 :(得分: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;
答案 3 :(得分:0)
如果您的目标是替换map,那么您需要'SortedDictionary',因为它还实现了一个红黑树。如果你想要一个哈希表,那么词典就可以了。