我需要一个像 C++ std::map 一样工作的类。更具体地说,我需要这样的行为:
map< string, vector<int> > my_map;
有可能吗?
4 回答
字典是我相信你想要的:
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。
这取决于你真正需要什么。正如已经说过的那样,您可以使用 获得查找行为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>
。用法与字典的用法基本相同
是的,您在问题中所写的声明是正确的。它将字符串映射到整数向量。但是, std::map 由红黑树实现支持,您的问题表明您需要一个哈希表。如果你可以使用 boost,你可以尝试他们的 unordered_map 实现。这是 tr1 规范的一部分,并将映射实现为哈希表。标准类型的散列函数已经在 boost 中实现了,所以你不需要担心这个。
#include <boost/unordered_map.hpp>
...
boost::unordered_map<std::string, std::vector<int> > my_map;
如果您的目标是替换地图,那么您需要“SortedDictionary”,因为它也实现了红黑树。如果你想要一个哈希表,那么 Dictionary 就可以了。