0

我需要一个像 C++ std::map 一样工作的类。更具体地说,我需要这样的行为:
map< string, vector<int> > my_map;
有可能吗?

4

4 回答 4

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),您需要一个 List 作为值类型:

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

值得注意的是 Dictionary 没有预定义的顺序,而 std::map 有。如果 order 很重要,您可能希望使用 SortedDictionary 代替,它的用法几乎相同,但按 key 排序。一切都取决于您是否真的打算遍历字典。

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

于 2009-12-16T13:19:11.920 回答
1

这取决于你真正需要什么。正如已经说过的那样,您可以使用 获得查找行为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>());

依此类推,Dictionary 内部使用 Hashtable,而 std::map 使用红黑树,因此 std::map 是有序的,而 Dictionary 是无序的。如果您需要一个有序的字典(这将更接近于 std::map,您可以使用System.Collections.Generic.SortedDictionary<Key, Value>。用法与字典的用法基本相同

于 2009-12-16T13:39:39.430 回答
0

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

#include <boost/unordered_map.hpp>
...
boost::unordered_map<std::string, std::vector<int> > my_map;
于 2009-12-16T13:24:41.470 回答
0

如果您的目标是替换地图,那么您需要“SortedDictionary”,因为它也实现了红黑树。如果你想要一个哈希表,那么 Dictionary 就可以了。

于 2009-12-16T14:13:35.290 回答