Как сбросить все значения vector<vector<int>>
до 0 без использования цикла и поддержания размера вектора.Самый быстрый способ сбросить все значения двухмерного вектора?
ответ
Вы должны использовать 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
сразу.
Вы можете использовать стандартные 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
сразу без итерации.
На самом деле 'std :: fill' может (легко) оптимизироваться компиляторами, чтобы не использовать цикл' for' (для 'std :: vector
@Holt: он фактически реализован как 'std :: memset' разработчиками libstdC++ или является компилятором, оптимизирующим цикл' for'? Я почти уверен, что компилятор всегда может преобразовать код 'for' в' memset'-эквивалентный код в этих тривиальных ситуациях. –
Это компилятор, оптимизирующий, но не только цикл 'for' внутри' std :: fill', но и вызов 'std :: fill', поэтому тело цикла выше в основном эквивалентно' std :: memset (inner_vec .data(), 0, (inner_vec.end() - inner_vec.begin()) * sizeof (int)) '(точка в том, что люди не должны бояться' std :: fill' для проблемы с производительностью, поскольку это может быть оптимизированы в большинстве случаев). – Holt
- 1. Самый быстрый способ установить все значения массива?
- 2. Самый быстрый способ найти поворот вектора
- 3. Самый быстрый способ Алгоритм
- 4. быстрый способ сбросить MySQL
- 5. Сбросить массив C int до нуля: самый быстрый способ?
- 6. Matlab: Самый быстрый способ повторности и умножать два вектора
- 7. Самый быстрый способ создать большой файл и самый быстрый способ его удалить
- 8. Самый быстрый/самый простой способ обновить datagridview?
- 9. Самый эффективный/быстрый способ удаления/удаления элементов вектора
- 10. Самый быстрый способ изменить значения массива?
- 11. Самый быстрый способ добавить deque на конец вектора?
- 12. Самый быстрый способ заполнить Hashset
- 13. Эффективный возврат двухмерного вектора
- 14. Самый быстрый способ выбрать данные
- 15. Самый быстрый способ горизонтальной суммы SSE без знакового байтового вектора
- 16. Самый быстрый способ утилизации вектора вдоль строк матрицы
- 17. Каков самый быстрый способ генерации вектора случайных бит?
- 18. Самый быстрый способ создания вектора умножения двух последовательных чисел
- 19. Самый быстрый способ сделать преобразование вектора треугольной матрицы в Matlab?
- 20. самый быстрый способ репликации вектора в двух направлениях
- 21. Самый быстрый способ взять
- 22. Самый быстрый способ импорта?
- 23. Самый быстрый способ сохранения изменений
- 24. Самый быстрый способ выражения memoize
- 25. Самый быстрый способ реализовать спрайт
- 26. Самый быстрый способ вычисления свертки
- 27. Самый быстрый способ отображения данных
- 28. Самый быстрый способ «игнорировать» строку
- 29. Самый быстрый способ заказать огромный вектор?
- 30. Самый быстрый способ создать флажки
Самый быстрый способ - ** сделать ** использовать петлю. – LogicStuff