Pytanie Czy czyszczenie wektora wpływa na jego pojemność?


Tworzę instancję std::vector foo(1000).

foo.size() jest teraz 1000 i foo.capacity() jest również 1000.

Jeśli wyczyści się wektor za pomocą foo.clear(), size() jest teraz 0, ale co to jest capacity()? Czy standard coś o tym mówi?


21
2017-07-30 11:24


pochodzenie


możliwy duplikat czy wywołanie std :: vector.clear () również ustawi std :: vector.reserve () na zero? - stefan


Odpowiedzi:


Nie, nie ma. Pojemność wektora nigdy się nie zmniejsza. Nie jest to wymagane przez standard, ale tak jest w przypadku standardowych implementacji biblioteki VC ++ i g ++. Aby ustawić pojemność wystarczającą do dopasowania do rozmiaru, użyj słynnej sztuczki wymiany

vector<T>().swap(foo);

W standardzie C ++ 11 możesz zrobić to bardziej jawnie:

foo.shrink_to_fit();

21
2017-07-30 11:28



W 0x, vector ma shrink_to_fit, ale standard stwierdza, że ​​jest niewiążący, co, jak sądzę, oznacza, że ​​wdrożenie nie jest wymagane, aby to zrobić. - Cat Plus Plus
@Cat: Nie wiedziałem tego! Interesujące, dzięki :) - Armen Tsirunyan
Czy możesz podać cytat c ++ 03? Tu jest napisane erase(.begin(), .end()) unieważnia wszystkie iteratory i odwołania po punkcie wymazywania. To chyba nie mówi nic o pojemności. - Johannes Schaub - litb
@Johannes: Powiedziałem, że nie jest wymienione w standardzie! Powiedziałem, że na większości wdrożeń tak jest! - Armen Tsirunyan
@Armen: Tak, nie możesz przekazać wartości r do swap, ale możesz wywołać swap na rvalues, stąd moja zamiana argumentów :) - fredoverflow


Aby usunąć wektor i zużyć jak najmniejszą pojemność, użyj sztuczki wymiany:

std::vector<T>().swap(foo);

Tworzy to pusty wektor, zamienia jego elementy wewnętrzne na foo, a następnie niszczy tymczasowy wektor, pozbawiając się elementów, które kiedyś należały foo i odejście foo jakby był świeżo stworzony.


5
2017-07-30 11:53



używam std::swap(foo, ItemContainer()) i mają typedef std::vector<T> ItemContainer gdzie indziej, gdy to możliwe. To jest bardziej rozpoznawalne (IMHO), aby argument tymczasowy przeszedł jako argument, niż by był to obiekt wywołujący i l-wartość. Twoja droga jest w 100% w porządku. - doug65536


Standard nie mówi nic o wpływie clear na capacity.


2
2017-07-30 11:27





Nie, jasne nie ma wpływu na pojemność (), pozostaje bez zmian, nawet jeśli się wyczyścisz. Jeśli chcesz zmniejszyć wektor, aby pasował, możesz użyć następującej sztuczki po wywołaniu wyczyść: foo.swap (wektor (foo));


0
2017-07-30 11:26



Może. Standard nie określa go, więc nie powinieneś na nim polegać. Chociaż większość implementacji robi to w ten sposób. - Björn Pollex
@ BjörnPollex Jeśli standard nie mówi, że pojemność może się zmniejszyć, to nie może. - curiousguy
@cualne_guy: Właściwie jeśli standardy nie mówią jednoznacznie, co się dzieje, to może się zdarzyć w dowolny sposób, w jaki chce to zrobić implementacja. - Zan Lynx
@ZanLynx Nie. Standard nie pozwala na takie rzeczy. Jeśli standard na to nie pozwala, to się nie stanie. - curiousguy