Czy istnieje sposób zmiany rozmiaru std :: vector na mniejszą pojemność, gdy nie potrzebuję już zarezerwowanego wcześniej miejsca?Jak zmniejszyć rozmiar std :: wektor?
Odpowiedz
Efektywny STL, autor: Scott Meyers, pozycja 17: Użyj sztuczki swap
, aby przyciąć nadmiarową pojemność.
vector<Person>(persons).swap(persons);
Po tym, persons
jest "skurczony, aby zmieścić".
Wynika to z faktu, że konstruktor kopiowania vector
przydziela tylko tyle, ile potrzeba dla kopiowanych elementów.
Utwórz nowy, tymczasowy wektor z istniejącego, a następnie wywołaj metodę wymiany na istniejącym, przekazując tymczasowy. Pozwól, aby tymczasowy (teraz ze starym, ponadwymiarowym, bufor) wyszedł poza zasięg.
Hej presto, twój wektor ma dokładnie odpowiedni rozmiar do zawartości.
Jeśli brzmi to jak dużo kopiowania i alokacji - pamiętaj, że tak właśnie robi wektor za każdym razem, gdy musi ponownie dokonać przydziału według dotychczasowego zarezerwowanego limitu.
[Edytuj] Tak, właśnie powiedziałem to samo, co Sebastien, innymi słowy. Kolejny przypadek stackoverflow race-condition ;-)
Cóż, przegłosowałem ciebie, ponieważ twoja odpowiedź jest nadal pomocna, nawet jeśli nie byłeś pierwszym, który to opublikował! :-) –
Heh, dzięki Onorio – philsquared
Szukasz odpowiednika QVector::squeeze i obawiam się, że nie istnieje w sposób wyraźny w STL. Przejdź do odpowiedzi Sébastiena, jeśli jest ona poprawna dla twojej implementacji STL.
Jeśli używasz C++ 11, możesz użyć vec.shrink_to_fit()
. W VS2010 przynajmniej to robi sztuczkę z zamianą dla ciebie.
To nie jest odpowiednik sztuczki wymiany. 'shrink_to_fit' jest niewiążącym żądaniem i wolno mu nic nie robić. –
Powiedziałem "w VS2010", ale tak, na innych kompilatorach może tego nie robić. –
@CatPlusPlus 'shrink_to_fit' z dużym prawdopodobieństwem wykona operację zamiany lub' realloc', ale z małą optymalizacją wektorów, która nadal nie spowoduje zresetowania 'capacity()', aby dopasować 'size()', ponieważ nie ma przydziału sterty aby zmniejszyć . Myślę, że to jest powód, dla którego jest określony jako "niewiążący". – Potatoswatter
Swap Sztuką jest skutecznym sposobem na zmniejszenie pojemności obiektu, to zamienia treść mojego wektora z nowo utworzonego jeden po budowie kopię:
vector<Person>(persons).swap(persons);
Zauważ, że nie ma gwarancji, że persons.capacity(); po podmienianiu jest równa wielkość: pojemność wektora (osób) jest pojemnością, którą implementacja biblioteki rezerwuje wektorom wielkości persons.size().
C++ 11 wprowadzono shrink_to_fit().
shrink_to_fit() jak również sztuczka typu swap nie gwarantuje, że wielkość pojemności jest efektywnie zmniejszona do wielkości wektora.
W każdym razie shrink_to_fit() może unieważnić twoje iteratory (jeśli nastąpi realokacja) lub nie może: to zależy od rzeczywistej implementacji biblioteki.
Należy pamiętać, że sztuczka swap wymaga persons.size() kopiowania konstrukcji Person i person.size() destructions. Funkcja shrink_to_fit() może ominąć to kopiowanie i może pozostawić twoje iteratory ważne. Mógłby. Ale od czasu do czasu zdarza się, że shrink_to_fit() jest zaimplementowany w warunkach wymiany ...
Czy mógłbyś wskazać, gdzie jest określone, że 'shrink_to_fit()' musi być zaimplementowane pod względem 'swap()'? –
@ TobySpeight dzięki za uwagę. Może mój angielski nie jest wystarczająco dobry. Miałem na myśli to, że ponieważ _shrink_to_fit() _ może być zaimplementowany w kategoriach wymiany, to czasami jest implementowany w ten sposób. Pozwól mi edytować odpowiedź. Jeśli mi się nie uda, możesz edytować odpowiedź, aby poprawić jej jakość. Twój wkład byłby mile widziany. Dzięki – jimifiki
- 1. Spinner: Jak zmniejszyć rozmiar spinnera
- 2. Wektor C++ zmniejsz rozmiar alokacji
- 3. Inicjujący Eigen :: wektor z std :: wektor
- 4. wektor std :: podaje
- 5. przekonwertować std: wektor NSArray
- 6. std :: wektor, wątek bezpieczeństwa, wielowątkowość
- 7. std :: wektor <std::string> crash
- 8. std :: wektor :: emplace_back i std :: move
- 9. std :: wektor szybciej niż std :: unordered_set?
- 10. C++ std :: wektor niezależnych std :: thread
- 11. (raporty kryształów) Jak zmniejszyć rozmiar pliku RPT
- 12. Jak zmniejszyć rozmiar pliku obrazu w java
- 13. Jak zmniejszyć rozmiar repo na Github
- 14. Jak zmniejszyć rozmiar podpisów na wszystkich rysunkach?
- 15. Jak mogę zmniejszyć rozmiar repozytorium Subversion?
- 16. Jak zmniejszyć rozmiar obrazu na przycisku?
- 17. Jak zmniejszyć rozmiar czcionki w NumberPicker
- 18. Jak zmniejszyć rozmiar pliku dziennika serwera sql?
- 19. Jak zmniejszyć rozmiar JPEG w Androidzie
- 20. jak zmniejszyć rozmiar exe przy użyciu py2exe
- 21. Jak zmniejszyć rozmiar pliku audio w IOS
- 22. Jak zmniejszyć rozmiar wykresu kołowego KendoUI?
- 23. std :: wektor :: przypisz odpowiednik QVector
- 24. Konwertuj std :: wektor na tablicę
- 25. Testuj zmiennoprzecinkowe std :: wektor z C++ Catch
- 26. C++ std :: transformuj wektor par-> pierwszy na nowy wektor
- 27. Jak mogę odkryć rozmiar/długość (w bajtach) std :: vector?
- 28. std :: wektor jako argument funkcji szablonu
- 29. Zwracanie C++ std :: wektor bez kopii?
- 30. znaleźć w std :: wektor <std::pair>
Zaproponuj poprawkę do gramatyki: "skurczona", a nie "pomniejszona" –
Ładna.Czy może wiesz, dlaczego nie zaimplementowali tego jako metody, ponieważ wygląda to na typowy przypadek użycia kontenera? – bombardier
Po przydzieleniu przez wektor bufora trudno jest usunąć [] koniec tego bufora. Takie działanie gwarantuje po prostu, że przyszłe wstawienia będą wymagały przydzielenia nowego bufora i skopiowania do niego całego pliku (unieważnienie iteratorów). –