2010-04-29 10 views
5

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

+1

można spróbować w obie strony i powiedzieć nam, jak poszło? –

+0

założyć, że masz na myśli 'resize (0)'? – Roddy

Odpowiedz

13

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.

+0

Lub przy użyciu MFC, jego tablica (tj. Wektor) ma klasę, która skutecznie zmienia rozmiar –

+0

Nie wiem o kontenerach MFC, OP powiedział wektor, więc założyłem, że oznaczało 'std :: vector '. – AshleysBrain

1

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()).

2

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.

0

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()' 
+0

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. –