Jaki jest odpowiednik wektora C ++ w języku C #?
Szukam tej funkcji:
Aby mieć dynamiczną tablicę przechowywanej w sposób ciągły pamięci, która nie ma wpływu na wydajność dostępu w porównaniu ze standardowymi tablicami.
Szukałem i mówią .NET equivalent to the vector in C++ is the ArrayList
, więc:
Czy ArrayList ma tę ciągłą funkcję pamięci?
Odpowiedzi:
Możesz użyć a,
List<T>
a kiedyT
jest typem wartości, zostanie on przydzielony w ciągłej pamięci, co nie miałoby miejsca, gdybyT
był typem referencyjnym.Przykład:
List<int> integers = new List<int>(); integers.Add(1); integers.Add(4); integers.Add(7); int someElement = integers[1];
źródło
List<T>
klasy zawiera wiele przykładów, ale zaktualizowałem moją odpowiedź, aby zawierała jeden.T
jest to typ referencyjny, nadal będziesz mieć ciągłą pamięć. Jest to w zasadzie tablica wskaźników ...T[]
... OP poprosił o „brak obniżenia wydajności w przypadku dostępu w porównaniu ze standardowymi macierzami” iList<T>
zapewnia to. A jeśliT
jest typem referencyjnym, jest to analogiczne doT*
w C ++, więc uzyskuje się tyle samo ciągłości, co w C ++. Jeśli chce się, aby same obiekty były ciągłe, to oczywiście potrzebne są typy wartości ... w obu językach. Różnica polega oczywiście na tym, że w C ++ każdy typ może być użyty jako value lub ref, podczas gdy w C # jest to właściwość typu poprzez rozróżnienie class / struct.List<T>
zawsze jest implementowana jako lista połączona wewnętrznie. Jak więc dynamicznie się rozwija, gdy dzwonimyAdd()
? Coś w rodzaju VB6,Redim Preserve
które kopiowało całą tablicę do nowej lokalizacji?List<T>
tworzy małą tablicęT[]
. Elementy wewnętrznie są dodawane do tablicy. Gdy rozmiar tablicy jest zakończony, tworzona jest nowa tablica o podwójnym rozmiarze w stosunku do poprzedniej. Dane są kopiowane do nowej większej tablicy, mniejsza jest niszczona i tak dalej. Programista może dać wskazówkę NET w celu utworzenia wystarczająco dużego wewnętrzną tablicę przed napełnieniemList
przez konstruktora:new List<T>(expected_array_size)
.używać
List<T>
. Wewnętrznie używa tablic, a tablice używają ciągłej pamięci.źródło
private T[] _items;
używane do przechowywania na zapleczu, typu referencyjnego lub nie.Przede wszystkim trzymaj się z dala od
Arraylist
lubHashtable
. Te klasy należy uznać za przestarzałe, na korzyść typów ogólnych. Nadal są w języku dla celów starszych.Teraz szukasz
List<T>
klasy. Zauważ, że jeśli T jest typem wartości, będziesz mieć pamięć contiguos, ale nie, jeśli T jest typem referencyjnym, z oczywistych powodów.źródło
C # ma wiele typów odwołań. Nawet jeśli kontener przechowuje odniesienia w sposób ciągły, same obiekty mogą być rozproszone po stercie
źródło
Wygląda na to, że CLR / C # może wkrótce uzyskać lepszą obsługę Vector <>.
http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx
źródło