2009-04-12 15 views
14

Czy ktoś może wskazać dobre odwzorowanie między zwykłymi kontenerami C++ STL, takimi jak wektor, lista, mapa, zestaw, multimap ... i ogólne pojemniki C#?Mapowanie między kontenerami stl C++ i C#

Jestem przyzwyczajony do tych pierwszych i jakoś przywykłem do wyrażania algorytmów w kategoriach tych pojemników. Ciężko jest mi znaleźć odpowiednik C#.

Dziękujemy!

+1

Natknąłeś się na najprawdopodobniej największą wadę biblioteki .NET klasy podstawowej ...Brakuje im wielu stosunkowo popularnych kontenerów. I podczas gdy LINQ ma przyzwoitą pracę zastępowania iteratorów w C++, nadal nie jest tak elastyczny (lub efektywny). – jalf

Odpowiedz

20

Oto szorstki równoważność:

  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 (biblioteka klasy podstawowej) nie ma drzewek czerwono-czarnych (mapa STL) ani kolejek priorytetów (make_heap(), push_heap(), pop_heap()).

. Kolekcje .NET nie używają "iteratorów" tak jak to robi C++. Wszystkie implementują IEnumerable<T> i mogą być iterowane przy użyciu instrukcji "foreach". Jeśli chcesz ręcznie sterować iteracją, możesz wywołać "GetEnumerator()" w kolekcji, która zwróci obiekt IEnumerator<T>. IEnumerator<T>.MoveNext() jest mniej więcej równoznaczne z "++" na iteratorze C++, a "Current" jest mniej więcej równoznaczne z operatorem wskazującym na wskaźnik ("*").

C# ma funkcję językową o nazwie "iteratory". Nie są jednak tym samym, co "obiekty iteracyjne" w STL. Zamiast tego są one funkcją językową, która umożliwia automatyczną implementację IEnumerable<T>. Więcej informacji można znaleźć w dokumentacji instrukcji yield return i yield break.

+0

Niestety, ale myślę, że masz C++ i Java nieco zmieszany. (Chociaż reszta twoich dyskusji wydaje się właściwa, wszystkie klasy, które wymieniasz po prawej stronie tabeli to kolekcje Java, a nie kontenery STL.) –

+0

Miałem obudowę niewłaściwą, a ja pominąłem "_" w haszyszu (oni są niestandardowe, ale większość kompilatorów je obsługuje). Zaktualizowałem nazwy. –

-2

Nie ma doskonałego bezpośredniego mapowania, ponieważ np. Zestaw C++ i mapa używają komparatorów, podczas gdy .HashSet i Dictionary używają skrótów.

1

Można też spojrzeć na STL/CLR który jest

... jest pakowanie Template Library Standard (STL), A podzbioru Standardowa biblioteka C++, do użytku z C++ i .NET Środowiskowe środowisko wykonawcze języka podstawowego (CLR). Za pomocą STL/CLR można używać wszystkich kontenerów, iteratorów i algorytmów STL w zarządzanym środowisku.

Ponadto, należy pamiętać, że można skompilować swój istniejący kod w C++/STL z flagą /clr.

+1

Czy masz z tym jakieś doświadczenie? Jak rozumiem, pozwala to tylko na użycie kodu podobnego do STL w zarządzanym C++. Nie zapewnia ona agnostycznej językowo implementacji podobnej do STL, prawda? Chciałbym mieć coś w stylu STL w języku C#. :) – jalf

+0

Nie próbowałem tego, ale wygląda na "wszystko", co musisz zrobić, to dodać odniesienie do Microsoft.VisualC.STLCLR i implementować IVector <> (lub IDeque <>, IList <>, itp. .) –