2016-10-03 3 views

ответ

4

Вы должны использовать std::fill в комбинации с for петли или std::for_each:

for (auto &v: vec) { 
    std::fill(v.begin(), v.end(), 0); 
} 

Здесь std::fill, скорее всего, упадут обратно на один вызов к std::memset (с приличным компилятором и флагами оптимизации), но вам нужно for для 1-го измерения.

Поскольку 2-D std::vector не является одним блоком памяти, нет возможности сбросить все до 0 сразу.

1

Вы можете использовать стандартные std::fill и std::for_each алгоритмы:

std::vector<std::vector<int>> vec; 

// Iterate over the first dimension of vectors... 
std::for_each(vec.begin(), vec.end(), [](std::vector<int>& inner_vec) 
    { 
     // ...fill every inner vector with zeros. 
     std::fill(inner_vec.begin(), inner_vec.end(), 0); 
    }); 

Обратите внимание, что эти алгоритмы внутренне реализованы с петлями: нет никакого способа, чтобы сразу установить несколько элементов в std::vector сразу без итерации.

+0

На самом деле 'std :: fill' может (легко) оптимизироваться компиляторами, чтобы не использовать цикл' for' (для 'std :: vector ', gcc 6.2 использует 'std :: memset' напрямую). – Holt

+0

@Holt: он фактически реализован как 'std :: memset' разработчиками libstdC++ или является компилятором, оптимизирующим цикл' for'? Я почти уверен, что компилятор всегда может преобразовать код 'for' в' memset'-эквивалентный код в этих тривиальных ситуациях. –

+1

Это компилятор, оптимизирующий, но не только цикл 'for' внутри' std :: fill', но и вызов 'std :: fill', поэтому тело цикла выше в основном эквивалентно' std :: memset (inner_vec .data(), 0, (inner_vec.end() - inner_vec.begin()) * sizeof (int)) '(точка в том, что люди не должны бояться' std :: fill' для проблемы с производительностью, поскольку это может быть оптимизированы в большинстве случаев). – Holt

Смежные вопросы