2010-09-07 146 views
11

我还在学习C#,很惊讶地发现List<T>更像是std::vector而不是std::list。有人可以用STL来描述所有的C#集合吗(或者如果STL比较很困难,标准的概念数据类型与维基百科链接?我期望这个参考将会非常有用C++ STL集合和C#集合的比较?

感兴趣的集合的最小列表包括随意添加其他):

  • 阵列
  • 列表
  • 的ArrayList
  • 哈希表
  • 字典
  • ListDictionary
  • SortedDictionary
  • 排序列表
  • 队列
  • 堆栈

编辑:我刚刚发现这个类似的问题可能会感兴趣:Mapping between stl C++ and C# containers

+2

除非你需要以.NET 1.x为目标,否则如果你问我,真的没有理由打扰非泛型。 – 2010-09-07 13:35:32

+0

LinkedList,HashSet,Lookup(通常通过ILookup接口引用)。我不知道STL,但我std :: list是不是像列表它可能更像是LinkedList 。 – 2010-09-07 13:37:53

+0

@Brian Rasmussen:哪些是非泛型?只是阵列? – 2010-09-07 15:00:20

回答

12

这里是我发现(忽略旧的非仿制藏品):

  • Array - C数组,尽管.NET数组可以有有一个非零的起始索引。
  • List<T> - std::vector<T>
  • Dictionary<TKey, TValue> - unordered_map<Key, Data>
  • HashSet<T> - unordered_set<Key>
  • SortedDictionary<TKey, TValue> - std::map<Key, Data>
  • SortedList<TKey, TValue> - 相当于std::vector<T>但保持它下令使用二进制搜索+添加元素时插入。
  • SortedSet<T> - std::set<Key>
  • Queue<T> - std::queue<T>
  • Stack<T> - std::stack<T>
  • LinkedList<T> - std::list<T>

从.NET集合值得注意的是失踪的是 “多” 变体,例如multisetmultimap但是,他们添加了一些非常有用的线程安全集合:“并发”变体,例如ConcurrentDictionary,ConcurrentQueue

+3

您可能希望将'hash_map'替换为'unordered_map',而技术上它仍然不是*标准*,包含在TR1中,并将包含在C++ 0x中。对于'hash_set'->'unordered_set'我们也是如此。顺便说一句,另一个缺失的变体是'std :: deque'。据我所知,没有.NET的等价物。 – jalf 2010-12-08 01:11:11

+0

所以没有相当于'std :: list'和'std :: deque'? – shinzou 2016-02-22 09:10:05

+0

@kuhaku:没有双向链表。实际上,由于.NET应用程序通常使用引用类型,因此'List '(实际上是一个向量)通常就足够了。也没有双端队列,这是一个更明显的省略IMO。 'List '通常用作替代品,因为引用类型占优势,所以它工作正常。 – 2016-02-22 13:09:04