Czytam w Internecie, że jeśli czyścisz replikę std::vector
(w ciasnej pętli), lepiej użyć resize(0)
zamiast clear()
, ponieważ może być szybszy. Nie jestem tego pewien. Czy ktoś ma na to ostateczną odpowiedź?Vector clear vs. resize
Odpowiedz
Zakładam, że oznaczać resize(0)
zamiast setsize
i nazywając że zamiast clear()
i że mówisz std::vector
. IIRC ostatnia odpowiedź omawiała to (nie można znaleźć łącza), a na nowoczesnych implementacjach STL, clear()
jest prawdopodobnie identyczna z resize(0)
.
Wcześniejsze czyszczenie wektora mogło zwolnić całą jego pamięć (tzn. Jego pojemność również spadła do zera), powodując ponowne przydziały po ponownym dodaniu elementów, w przeciwieństwie do resize(0)
utrzymując pojemność, więc jest mniej przesunięć. Myślę jednak, że w nowoczesnych bibliotekach STL nie ma różnicy. Jeśli używasz starej implementacji STL lub jesteś po prostu paranoidalny, resize(0)
może być szybszy.
Lub przy użyciu MFC, jego tablica (tj. Wektor) ma klasę, która skutecznie zmienia rozmiar –
Nie wiem o kontenerach MFC, OP powiedział wektor, więc założyłem, że oznaczało 'std :: vector
Ta specyficzna implementacja dźwiękowa jest zadaniem dla Ciebie, Twojej biblioteki i profilera. Ale jak widzę, nie widzę, dlaczego zmiana rozmiaru (0) powinna być szybsza, gdy obie będą musiały wywoływać funkcję kasowania (begin(), end()).
Patrząc na Dinkumware źródła STL, zarówno skutecznie wywołać erase(begin(), end());
clear()
jest nieco bardziej wydajny, zaskoczeniem., Gdyż ma tylko jeden przypadek do czynienia. ale nie spodziewałbym się, że będzie to mierzalne.
Wygląda na to, że występuje różnica między jasnością i rozmiarem (0), gdy wektor zawiera obiekty klasy, która nie ma domyślnego konstruktora. Na przykład, następujący kod zostanie skompilowany:
#include <vector>
class A {
private:
int x,y;
public:
A(int x,int y) :x(x), y(y) {}
};
int main() {
std::vector <A> aa;
aa.clear();
}
Ale jeśli wymienia na aa.clear()
przez aa.resize(0)
, otrzymasz błąd kompilacji:
error: no matching function for call to 'A::A()'
Przypuszczam, że dzieje się tak, ponieważ zmiana rozmiaru wymaga domyślnego konstruktora, aby mógł domyślnie konstruować nowe elementy, jeśli zmieniasz rozmiar na większy niż bieżący rozmiar. –
- 1. Vector vs Array Performance
- 2. Rzadki Wektor vs Gęsta Vector
- 3. C++ Array vs Vector test objaśnienia testu
- 4. std :: vector :: wymazać vs „swap i pop”
- 5. Co to jest Tuple? I tuple vs. List vs. Vector?
- 6. Względna wydajność std :: vector vs. std :: list vs. std :: slist?
- 7. Resize VideoView
- 8. Resize ArrayBuffer
- 9. std :: list resize daje nieoczekiwane wyniki
- 10. Dlaczego <clear></clear> to nie to samo, co <clear /> w pliku app.config?
- 11. Samodzielna, zgodna z STL implementacja std :: vector
- 12. std :: vector reserve() i push_back() jest szybszy niż resize() i indeks tablicy, dlaczego?
- 13. Polecenie sbt clear screen
- 14. Datatables clear tbody
- 15. Clear SingleChoice ListView Wybór
- 16. AutoCompleteBox i SearchText Clear
- 17. Weird float clear issue
- 18. Proportional image resize
- 19. mylić o hashmap # resize
- 20. Resize NSPopover po wyświetleniu
- 21. C# Hide Resize Cursor
- 22. SplitContainer panel Resize Issue
- 23. Google maps responsive resize
- 24. Swiper height auto resize
- 25. iText Image Resize
- 26. Bezpieczeństwo wątków pisania std :: vector vs plain array
- 27. Zaawansowany iterator dla std :: vector std :: advance VS operator +?
- 28. VBA Clear Selections of Combobox
- 29. Emacs ESS wersja Clear Console
- 30. Różnica między session.evict kontra clear
można spróbować w obie strony i powiedzieć nam, jak poszło? –
założyć, że masz na myśli 'resize (0)'? – Roddy