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));        
Другие вопросы по тегам