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ź.
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ź.
Nie do końca. Opcja pierwsza wywoła konstruktor dla każdego elementu, a opcja 2 nie.
absolutnie różne. Sprawdź co pokazuje V.size() w obu przypadkach.
Panowie, czy moglibyście łopatologicznie wytłumaczyć na czym polega różnica?
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:
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).
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.