Memset на вектор C++
Есть ли эквивалентная функция memset
для векторов в C++?
(Не clear()
или же erase()
метод, я хочу сохранить размер вектора, я просто хочу инициализировать все значения.)
5 ответов
Использование std::fill()
:
std::fill(myVector.begin(), myVector.end(), 0);
Если ваш вектор содержит типы POD, на нем безопасно использовать memset - хранение вектора гарантированно будет смежным.
memset(&vec[0], 0, sizeof(vec[0]) * vec.size());
Изменить: Извините, что бросил неопределенный термин в вас - POD означает простые старые данные, то есть типы, которые были доступны в C и структуры, построенные из них.
Изменить еще раз: как указано в комментариях, хотя bool
это простой тип данных, vector<bool>
Это интересное исключение, и он потерпит неудачу, если вы попытаетесь использовать memset на нем. Ответ Адама Розенфилда все еще отлично работает в этом случае.
Ты можешь использовать assign
метод в векторе:
Присваивает новое содержимое вектору, заменяя его текущее содержимое и соответственно изменяя его размер (если вы не меняете размер вектора, просто передайте vec.size()).
Например:
vector<int> vec(10, 0);
for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 0 0 0 0 0 0 0 0 0 0
// memset all the value in vec to 1, vec.size() so don't change vec size
vec.assign(vec.size(), 1); // set every value -> 1
for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 1 1 1 1 1 1 1 1 1 1
Цитируется: http://www.cplusplus.com/reference/vector/vector/assign/
Другой способ, я думаю, что я видел это сначала в книге Мейерса:
// Swaps with a temporary.
vec.swap( std::vector<int>(vec.size(), 0) );
Его единственный недостаток в том, что он делает копию.
m= Количество строк && n== Количество столбцов
vector<vector<int>> a(m,vector<int>(n,0));