2012-06-25 11 views
7

Jaka jest dokładna różnica między tablicami dynamicznymi a wektorami. To było dla mnie pytanie do wywiadu.Dynamiczne tablice kontra wektory STL dokładna różnica?

  1. Powiedziałem, że oba mają pamięć sekwencyjną.

  2. Wektory można hodować w dowolnym punkcie kodu. Następnie powiedział, że nawet dynamiczne tablice mogą być powiększane po utworzeniu.

  3. Powiedziałem, że wektory są wolne od błędów, ponieważ znajdują się w standardowej bibliotece. Powiedział, że dostarczy plik .so dynamicznych tablic, który jest wolny od błędów i ma wszystkie cechy na równi ze STL.

Jestem zdezorientowany i nie odpowiedziałem na dokładną różnicę. Kiedy szukałem w Internecie, widziałem tylko powyższe stwierdzenia.

Czy ktoś może mi wyjaśnić dokładną różnicę? A czego oczekiwał ode mnie ankieter?

+2

Zapomniałaś o wielkiej biblioteki algorytmów dostarczany bezpłatnie z kompilatora. – DumbCoder

+0

zobaczyć również http://stackoverflow.com/q/381621/1025391 – moooeeeep

+0

oh no .. Powiedziałem wolne od błędów .. I wrote błędnie powyżej i teraz edytowane – Rajesh

Odpowiedz

0

Pamięć tablicowa przydzielona do wektorów jest zwalniana, gdy wektor wykracza poza zakres, w przypadku gdy wektor jest zadeklarowany na stosie (tablica podkładowa będzie na stercie).

void foo() { 
    vector<int> v; 

    // ... method body 

    // backing array will be freed here 
} 
10

Powiedział on dostarczyć jako plik .so dynamicznych tablic, które jest wolne od błędów i ma wszystkie cechy, na równi z STL.

Jeśli jego klasa dynamiczna tablica działa tak samo jak std::vector (czyli: implementuje RAII posprzątać po sobie, mogą rosnąć i kurczyć i cokolwiek innego std::vector robi), to istnieje tylko jedna duża zaleta std::vector ma ponad jego klasa dynamiczna tablica:

std::vector jest standaryzowany i każdy wie, że. Jeśli widzę w jakimś kodzie kod std::vector, dokładnie wiem, co robi i jak ma być używany. Jeśli jednak widzę my::dynamic_array, wcale tego nie wiem. Musiałbym popatrzeć na jego dokumentację, a nawet - sapnąć! - wdrożenie, aby dowiedzieć się, czy my_dynamic_array::resize() robi to samo, co .

+0

Myślę, że tablica dynamiczna tutaj oznacza nie klasy, ale po prostu dynamicznie przydzielona tablica za pomocą 'new []'. –

+0

@Als: "dynamiczne tablice, które ... mają wszystkie cechy na równi z STL". Nie możesz tego zrobić bez tworzenia klasy. – sbi

+0

Jak na ankietera, powiedział, że to klasa. – Rajesh

5

Bardzo wiele zależy od tego, co rozumie przez "tablicę dynamiczną". Większość ludzi ma na myśli coś, w czym pamięć jest alokowana za pomocą tablicy-new i uwolniona przy pomocy array-delete. Jeśli tak jest w tym przypadku, to posiadanie cech na równi z std::vector po prostu nie jest możliwe.

Powód jest dość prosty: std::vector rutynowo przydziela fragment pamięci większy niż to konieczne, aby pomieścić liczbę aktualnie zapisywanych elementów. Następnie konstruuje obiekty w tej pamięci zgodnie z potrzebą rozszerzenia. Z tablicą-nową nie masz jednak wyboru - przydzielasz tablicę obiektów, więc jeśli przydzielisz przestrzeń dla (powiedzmy) 100 obiektów, otrzymasz 100 obiektów tworzonych w tym miejscu (natychmiast) . Nie ma po prostu bufora, którego część zawiera prawdziwe obiekty, a inna część to zwykła pamięć, nie zawierająca niczego.

Przypuszczam, że jeśli chcesz rozciągnąć punkt, można naśladować std::vector i nadal przydzielać spację za pomocą tablicy-new. Aby to zrobić, wystarczy przydzielić tablicę z char, a następnie użyć miejsca docelowego new do utworzenia obiektów w tym surowym obszarze pamięci. Pozwala to prawie to samo, co std::vector, ponieważ jest prawie to samo, co std::vector. Ciągle brakuje (potencjalnego) poziom zadnie chociaż - std::vector faktycznie przydziela pamięć za pośrednictwem obiektu podzielnik więc można zmienić dokładnie jak to przydziela jej surowej pamięci (domyślnie używa std::allocator<T>, który wykorzystuje operator new, ale jeśli chciał , możesz napisać przydział, który będzie używał new char[size], ale nie mogę sobie wyobrazić, dlaczego miałbyś).

Możesz, oczywiście, napisać dynamicznej tablicy do korzystania z obiektu przydzielania również. W tym momencie, ze względów praktycznych, właśnie wymyśliłeś na nowo std::vector pod (prawdopodobnie) nową nazwą. W tym przypadku @sbi ma nadal rację: sam fakt, że nie jest standaryzowany oznacza, że ​​wciąż brakuje jednej z głównych cech std:::vector - jakości bycia znormalizowanym i znanym już wszystkim, którzy znają C++. Jednak nawet bez tego musimy rozciągnąć wyrażenie "dynamiczna tablica" na (a poza tym założyć) punkt przełomowy, aby uzyskać te same cechy, co std::vector, nawet jeśli ignorujemy standaryzację.

1

Spodziewam chcieli rozmawiać o pułapkach zapominając usunąć dynamiczna tablica z operatora delete [], a następnie irytować się, gdy próbowali pomóc wzdłuż; nie ma większego sensu implementacja tablicy dynamicznej jako zwykłej klasy, ponieważ piecze się w typie elementu.

Powiązane problemy