2010-09-07 62 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