Я пытаюсь установить значения всех элементов в 2D-векторе на определенное значение. Насколько мне известно, нельзя использовать memset для векторов, например, как они используются для массивов. Следовательно, я должен использовать std :: fill, чтобы установить все элементы в 2D-векторе на определенное значение. Однако я знаю, как использовать заливку для одномерного вектора, как показано ниже.
vector<int> linearVector (1000,0);
fill(linearVector.begin(),linearVector.end(),10);
Однако, когда я пытаюсь сделать что-то подобное для 2D-вектора (как показано ниже), это не работает.
vector<vector<int> > twoDVector (100,vector <int> (100,0));
fill(twoDVector.begin(),twoDVector.end(),10);
PS: Я знаю, что могу легко создать вложенный цикл for, чтобы вручную установить для элементов 2D-вектора желаемое значение. Однако в моей программе это невозможно, поскольку размер 2D-вектора довольно велик, и параллельно выполняются другие требующие много времени функции (рекурсивные функции).
Подсказка: вы уже заполнили каждый элемент twoDVector (и каждый элемент каждого из этих элементов) одним и тем же значением, когда вы его инициализировали.
data() возвращает необработанный массив, и на этом вы можете использовать memset. Только с C++ 11.





Вы можете использовать это так:
fill(twoDVector.begin(), twoDVector.end(), vector<int>(100, 10));
Это было бы менее эффективно, чем вложенный цикл.
В C++ 17 это можно сделать, как показано ниже:
#include <algorithm>
#include <execution>
#include <vector>
//...
std::for_each(std::execution::par_unseq, nums.begin(), nums.end(),
[](std::vector<int>& vec) {
std::for_each(std::execution::par_unseq, vec.begin(), vec.end(),
[](int& n) {n = 10;});}
);
Вроде бы параллельно, но не так наглядно, как простая функция заполнения;)
Конечно, вы можете передать свою собственную переменную вместо жестко запрограммированного 10.
Это должно вам помочь
std::vector<std::vector<int> > fog(
A_NUMBER,
std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value
Подсказка: это не 2D-вектор. Это вектор векторов.