2009-04-12 53 views
14

有人能指出常用C++ STL容器(如vector,list,map,set,multimap ...和C#泛型容器)之間的良好映射嗎?stl C++和C#容器之間的映射

我習慣了前者,不知何故,我習慣於用這些容器來表達算法。我很難找到相當於C#的C#。

謝謝!

+1

你已經偶然發現了.NET基類庫最大的缺點......他們錯過了很多相對常見的容器。雖然LINQ在替換C++迭代器方面做得不錯,但它仍然不靈活(或高效) – jalf 2009-04-12 12:58:36

回答

20

這裏有一個粗略的等價

  1. Dictionary<K,V> < =>unordered_map<K,V>
  2. HashSet<T> < =>unordered_set<T>
  3. List<T> < =>vector<T>
  4. LinkedList<T> < =>list<T>

.NET BCL(基類庫)沒有紅黑樹(stl map)或優先級隊列(make_heap(),push_heap(),pop_heap())。

.NET集合不像C++那樣使用「迭代器」。它們全部實現IEnumerable<T>,並且可以使用「foreach語句」進行迭代。如果你想手動控制迭代,你可以在集合上調用「GetEnumerator()」,這將返回一個IEnumerator<T>對象。 IEnumerator<T>.MoveNext()大致相當於C++迭代器上的「++」,「Current」大致等同於指針式參數運算符(「*」)。

C#確實有一個稱爲「迭代器」的語言功能。然而,它們與STL中的「迭代器對象」不同。相反,它們是允許自動執行IEnumerable<T>的語言功能。有關更多信息,請參閱yield returnyield break語句的文檔。

+0

對不起,但我認爲你有C++和Java在這裏有一些困惑。 (雖然其餘的討論似乎是正確的,但您在表右側列出的所有類都是Java集合,而不是STL容器。) – 2009-04-12 01:22:08

+0

我的套件錯了,我在散列內容中省略了「_」(他們是不標準的,但大多數編譯器都支持它們)。 我更新了名字。 – 2009-04-12 01:35:56

-2

沒有一個了不起的直接映射,例如, C++集合和映射使用比較器,而.Net HashSet和Dictionary使用哈希代碼。

1

您可能還需要看一看STL/CLR

...是 標準模板庫(STL),標準C++庫的一個子集 , 的使用的包裝與C++和.NET框架公共語言運行庫 (CLR)。使用STL/CLR,您可以在託管的 環境中使用STL的所有容器,迭代器和 算法。

另外,請記住,您可以用/CLR標誌編譯現有的C++/STL代碼。

+1

你有什麼經驗嗎?據我瞭解,它只允許您在託管C++中使用類似STL的代碼。它不提供與語言無關的STL類似的實現,是嗎?我很想在C#中使用類似STL的東西。 :) – jalf 2009-04-12 12:57:15

+0

我沒有真的嘗試過,但它看起來像所有你需要做的是添加一個引用到Microsoft.VisualC.STLCLR並實現IVector <>(或IDeque <>,IList <>等。) – 2009-04-12 18:27:40