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).
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).
Zastosowanie std::fill()
:
std::fill(myVector.begin(), myVector.end(), 0);
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.
Co to jest typ POD? – avd
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. –
"Zwykłe stare dane" - liczby całkowite, struktury (które zawierają tylko POD), znaki ... – LiraNuna
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ę.
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