Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

resize array

Ostatnio zmodyfikowano 2013-04-27 01:11
Autor Wiadomość
DejaVu
» 2013-04-26 22:04:23
Żaden z przedstawionych testów nie jest prawidłowy. std::vector to zawsze ciągły blok pamięci, a zatem jest to tablica. Jeżeli wiemy, że ma być 10k elementów to należy wykonać
C/C++
std::vector < int > v;
v.reserve( 10000 );
zanim jakiekolwiek operacje będzie się na nim wykonywało, bowiem unika się wielokrotnego wywoływania konstruktorów kopiujących przy powiększaniu rozmiaru tablicy. Żeby porównywać wydajność istniejących narzędzi to najpierw trzeba wiedzieć jak one działają, a nie chlapnąć 3 linijki na krzyż i wykazać, że rozwiązanie A jest lepsze od rozwiązania B (bo test tak został nieświadomie ułożony).

/edit:
Nie wspomnę jeszcze o wadach alokacji takich ogromnych obszarów pamięci na stosie zamiast na stercie.
P-81242
ison
» 2013-04-26 22:15:56
Żaden z przedstawionych testów nie jest prawidłowy. std::vector to zawsze ciągły blok pamięci, a zatem jest to tablica. Jeżeli wiemy, że ma być 10k elementów to należy wykonać
u mnie jest nawet resize zamiast reserve, więc nie ma mowy o realokacji
P-81243
DejaVu
» 2013-04-26 22:21:40
@ison: nie zauważyłem Twojej wypowiedzi :P realokacji nie będzie, ale jedna alokacja i tak pójdzie (co i tak jest lepsze niż alokacja tablicy na stosie) :)
P-81244
crash
» 2013-04-27 00:05:00
Ok, w części nawaliłem, wyszła niewiedza, ale zakładając sytuację, w której należy wczytać do vectora nieznaną ilość elementów z góry, nie można użyć metody resize. Tak czy nie :) Vector ma być tablicą dynamiczną i chwała, że nią w pełni jest. Tak czy owak w pewnych okolicznościach będzie zachowywał się wolniej od zwyczajnej tablicy, co jest zrozumiałe.

DejaVu@ nie wiesz może, czy vector zachowuje się jak tablica dynamiczna w Delphi? Tab. d. w Delphi musi być ciągłym blokiem danych, kiedy użyje się SetLength aby zwiększyć rozmiar, a program w pamięci natrafi na dane, musi znaleźć wtedy inne miejsce o określonym rozmiarze i tam przenieść tablicę - czy podobnie jest z vectorem?
P-81249
akwes
» 2013-04-27 00:14:10
Tak.


Just like arrays, vectors use contiguous storage locations for their elements, which means that their elements can also be accessed using offsets on regular pointers to its elements, and just as efficiently as in arrays. But unlike arrays, their size can change dynamically, with their storage being handled automatically by the container.
http://www.cplusplus.com/reference/vector/vector/
Mówiłem to w pierwszym moim poście.


ale zakładając sytuację, w której należy wczytać do vectora nieznaną ilość elementów z góry, nie można użyć metody resize. Tak czy nie :)

Tak samo jak w przypadku tablic statycznych i dynamicznych ;)
P-81250
DejaVu
» 2013-04-27 00:29:42
Tak czy owak w pewnych okolicznościach będzie zachowywał się wolniej od zwyczajnej tablicy, co jest zrozumiałe.
W żadnym wypadku std::vector nie będzie wolniejszy od tablicy bo jest on tablicą. Tablica ma stały rozmiar, a vector potrafi się powiększyć. W każdym przypadku vector jest lepszy niż tablica o stałym rozmiarze.
P-81251
usmiech
Temat założony przez niniejszego użytkownika
» 2013-04-27 01:11:34
Ciesze sie, ze ten temat wywolal taka dyskusje.... Napisalem maly program na dynamiczna array ... na poczatku ma wielkosc 10 argumentow, jesli jednak uzytkownik wpisze 11 argument to array powieksza sie o tyle ile chcemy... ot oszczednosc pamieci .. Pozdrawiam
P-81252
1 2 « 3 »
Poprzednia strona Strona 3 z 3