2013-03-24 17 views
18

Jestem prawie pewien, że to powinna być duplikatem ale szukałem jakiegoś czasu i nie mógł znaleźć odpowiedź. Co powinienem użyć w C#, aby zastąpić wektor C++ i deque wydajnie. Potrzebuję struktury obsługującej bezpośrednie indeksowanie, a także wspierającej usuwanie z jednego lub obu końcach (w zależności od wektora lub przypadku deque) ponownie w efektywny sposób.C# równoważne do C++ wektorem lub deque

W języku java zwykle używam ArrayList co najmniej dla wektora, ale dla C# znalazłem this source, który stwierdza: ArrayList resizes dynamically. As elements are added, it grows in capacity to accommodate them. It is most often used in older C# programs.. Więc jaki jest nowy sposób na zrobienie tego? I znowu, co mam zrobić w sprawie Deque?

+0

Jedną opcją jest https://github.com/dcastro/DequeNET –

Odpowiedz

16

Nie ma wbudowanego deque pojemnika, ale istnieje kilka implementacje dostępne.

Oto a good one from Stephen Cleary. Zapewnia to operacje O (1) indeksowania, a także wstawiania na początku i dołączania na końcu.

C# równoważne Vector jest List<T>. Dostęp indeksowany to O (1), ale wstawianie lub usuwanie to O (N) (inne niż wstawianie na końcu, czyli O (1)).

+0

Jak efektywna jest operacja indeksowania w' List'? Myślałem, że po prostu przejdzie przez listę –

+4

@IvayloStrandjev to nie jest podwójnie związana lista, to wektor. – wRAR

+0

@Ivaylo: Nie, nie jest połączoną listą, jest opakowaniem w całej tablicy, więc indeksowanie używa tylko indeksu do bezpośredniego dostępu do podstawowej tablicy, więc jest to operacja O (1). (Prawie tak samo jak C++ wektor) –

3

Rozważ System.Collections.Generic.List i inne z System.Collection.Generic służą one temu samemu celowi, co ich odpowiedniki C++.
Dodatkowo może być więcej pojemników dla ciebie. Spójrz na here.

+0

'Generic', a nie' Generics' – wRAR

+0

@wRAR Too true! Dziękuję, zawsze to mieszam –

+1

Czy to Deque czy Dequeue? Nie mogę znaleźć niczego w Deque. Nie ja bym to robił. –

8

Przez C# vector, dobrym kandydatem jest System.Collection.Generic.List jak inni wspomniano.
Najbliżej deque w C++ będzie System.Collection.Generic.LinkedList co jest podwójnie połączoną listą.

+4

+1, Lista Połączona wydaje się najlepszym rozwiązaniem usuwania błędów, jeśli nie potrzebujesz dostępu do elementów w środku. – DCShannon

+3

Polecenie 'LinkedList' jako zamiennika' deque' jest niepoprawne i niedokładne. Są to całkowicie różne bestie (bez przydziału w sąsiednich miejscach) i absolutnie nie można ich zastąpić. –

Powiązane problemy