std::vector, rezerwacja pamięci

0

Cześć. Mam krótkie pytanie: czy poniższe zapisy są równoważne?

vector<double> V(10);

oraz

vector<double> V;
V.reserve(10);

Dziękuję z góry za odpowiedź.

0

Nie do końca. Opcja pierwsza wywoła konstruktor dla każdego elementu, a opcja 2 nie.

0

absolutnie różne. Sprawdź co pokazuje V.size() w obu przypadkach.

0

Panowie, czy moglibyście łopatologicznie wytłumaczyć na czym polega różnica?

0
Plissken napisał(a):

Panowie, czy moglibyście łopatologicznie wytłumaczyć na czym polega różnica?

Pierwszy sposób tworzy ci vector posiadający 10 elementów, a więc:

  • przydziela pamięć dla 10 elementów
  • wywołuje konstruktor domyślny dla każdego z elementów (co to jest konstruktor domyślny chyba wiesz?)

drugi sposób tylko rezerwuje pamięć dla 10 elementów (jak słusznie zauważył @Endrju dla co najmniej tylu). Stąd ich pojemności są równe (capacity) (co najmniej), a rozmiary różne (size). Warto też zauważyć iż podanie jako parametru reserve wartości mniejszej od pojemności wektora powoduje iż reserve jest rozkazem pustym - co ciekawsze dla stringów sytuacja ta nie występuje (następuje zmniejszenie pojemności).

0
vector<double> V(10);

tworzy wektor dziesięciu wartości typu double, każdą o wartości 0.0

vector<double> V;

tworzy pusty wektor.

V.reserve(10);

rezerwuje pamięć na dziesięć wartości, ale nic nie dodaje. wektor nadal jest pusty.
użycie reserve() nie jest konieczne. normalnie pamięć i tak jest rezerwowana w miarę dodawania kolejnych elementów. czasem jednak dobrze jest zarezerwować z góry określony rozmiar docelowy wektora, dla poprawienia wydajności programu. ale ma to sens np. dla tysiąca elementów, na pewno nie dla dziesięciu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1