2009-11-03 20 views
35

Czy istnieje odpowiednik funkcji memset dla wektorów w C++?Zestaw na wektor C++

(Nie clear() lub erase() metoda, chcę zachować wielkość wektora, po prostu chcę, aby zainicjować wszystkie wartości).

Odpowiedz

67

Zastosowanie std::fill():

std::fill(myVector.begin(), myVector.end(), 0); 
+5

Jeśli martwisz się o wydajność, większość implementacji STL będzie zawierała specjalistyczne implementacje std :: fill, które wykonują operacje memsets tam, gdzie to możliwe. – razeh

22

Jeśli wektor zawiera POD typy , jest bezpieczny w użyciu memset na nim - przechowywanie wektora gwarantuje ciągłość.

memset(&vec[0], 0, sizeof(vec[0]) * vec.size()); 

Edit: Niestety rzucać niezdefiniowanej termin na ciebie - POD oznacza Plain Old Data, to typy, które były dostępne w C i struktury zbudowane z nich.

Edycja ponownie: Jak zauważył w komentarzach, choć bool jest prosty typ danych, vector<bool> to ciekawy wyjątek i nie zdało egzaminu, jeśli spróbujesz użyć memset na nim. Adam Rosenfield's answer nadal działa idealnie w tym przypadku.

+0

Co to jest typ POD? – avd

+0

Z technicznego punktu widzenia, pamięć wektorowa nie jest w 100% gwarantowana przylegania do niej przez standard C++ 03, ale wszystkie implementacje implementują ją w ten sposób, dzięki czemu memset jest rzeczywiście bezpieczny dla typów POD. C++ 0x usuwa problem i wymaga, aby wszystkie implementacje wektorowe używały pamięci ciągłej. –

+1

"Zwykłe stare dane" - liczby całkowite, struktury (które zawierają tylko POD), znaki ... – LiraNuna

3

Innym sposobem, myślę, że widziałem go najpierw w Meyers książki:

// Swaps with a temporary. 
vec.swap(std::vector<int>(vec.size(), 0)); 

Jego jedyną wadą jest to, że tworzy kopię.