问题 C ++ STL集合和C#集合的比较?


我还在学习C#,并惊讶地发现了一个 List<T> 更像是一个 std::vector 比一个 std::list。有人可以根据STL描述所有C#集合(或者如果STL比较很困难,标准概念数据类型与维基百科链接?我希望该引用将广泛有用。

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

  • 排列
  • 名单
  • 数组列表
  • 哈希表
  • 字典
  • ListDictionary
  • SortedDictionary
  • 排序列表
  • 队列

编辑:我刚发现这个类似的问题可能会引起关注: stl C ++和C#容器之间的映射


2282
2017-09-07 13:27


起源

除非你需要针对.NET 1.x,否则如果你问我,没有理由打扰非泛型类型。 - Brian Rasmussen
LinkedList,HashSet,Lookup(通常通过接口ILookup引用)。我不知道STL,但我std :: list不像List <T>它可能更像LinkedList <T>。 - Albin Sunnanbo
@Brian Rasmussen:哪些是非仿制药?只是阵列? - Scott Stafford
ArrayList,HashTable。实际上,System.Collections命名空间中的任何类(与在.NET 2中添加的System.Collections.Generic相对) - Etienne de Martel


答案:


这是我发现的(忽略旧的非泛型集合):

  • 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但是,他们添加了许多非常有用的线程安全集合:“并发 - ”变体,例如, ConcurrentDictionaryConcurrentQueue


12
2017-09-07 14:45



你可能想要替换 hash_map 同 unordered_map,虽然技术上还没有 标准,包含在TR1中,并将包含在C ++ 0x中。我们也是如此 hash_set - > unordered_set。顺便说一下,另一个缺失的变种是 std::deque。据我所知,没有.NET等价物。 - jalf
所以没有相当于 std::list 和 std::deque? - shinzou
@kuhaku:没有双向链表。实际上,由于.NET应用程序通常使用引用类型, List<T> (实际上是一个向量)通常就足够了。也没有双端队列,这是一个更明显的遗漏IMO。再次, List<T> 通常用作替代品,因为参考类型占优势,所以工作正常。 - Stephen Cleary
发布后我发现了这个: msdn.microsoft.com/en-us/library/he2s3bh7(v=vs.110).aspx 所以我认为LinkedList是新的? - shinzou
另外,为什么会这样 List<T> 如果您需要在容器中的任何位置添加和删除元素,那么它是否仍然可以,有时会导致重新分配? - shinzou