Я выделил большой двойной вектор, скажем, с помощью 100000 элементов. В какой-то момент в моем коде я хочу, чтобы все элементы были постоянными, отличными от нуля. Как я могу это сделать без использования цикла for для всех элементов? Я также использую пакет blas, если это помогает.Инициализировать двойной массив с ненулевыми значениями (blas)
ответ
Вы можете использовать std::fill
(#include <algorithm>
):
std::fill(v.begin(), v.end(), 1);
Это, по существу, также только петля конечно ..
Вы всегда использовать memset()
, если вы не хотите, чтобы петли.
То есть, memset(myarr, 5, arrsize);
для того, чтобы его заполнить всем 5. Остерегайтесь неявного преобразования в unsigned char.
СИНТАКСИС
#include <string.h> void * memset(void *b, int c, size_t len);
ОПИСАНИЕ
The memset() function writes len bytes of value c (converted to an unsigned char) to the byte string b.
И если вектор велик, и вам это нужно идти быстро, и вы используете GCC, то:
Генерация кода перемещения блока (memcpy) и набор блоков (memset) были переписаны. GCC теперь может выбрать лучший алгоритм (цикл, развернутый цикл, инструкция с префиксом или вызов библиотеки) на основе размер скопированного блока и для оптимизации процессора.
-1: У него есть двойной вектор и memset для двойного вектора (я могу понять, что это смежный массив под вектором), когда он специально хочет, чтобы это ненулевое значение не было тривиальным. Значение, которое может быть установлено с помощью memset, представляет собой байт (размер unsigned char), а константа, которую он хочет установить, равна 4 байтам. –
Пропущенный двойной вектор во время чтения. Если ему нужны все 4 байта, то да, этого не будет. С другой стороны, он, вероятно, хочет отметить их как «неиспользуемые», и один байт может сделать трюк. – Milan
Я не вижу, чтобы OP упоминал об этом. Но, если быть точным с его вопросом, я считаю, что std :: fill - его лучший выбор. –
«fill» находится прямо от того, что вы сказали.
Имейте в виду, что это также можно построить вектор полный заданного значения:
std::vector<double> vec(100000, 3.14);
Так что если «в какой-то момент» означает «сразу после окончания строительства», сделать это вместо этого. Кроме того, это означает, что вы можете сделать это:
std::vector<double>(100000, 3.14).swap(vec);
, которые могут быть полезны, если «в какой-то момент» означает «сразу после изменения размера», и вы ожидаете/хотите вектор быть перераспределены («ожидать», если вы делаете его больше, чем его предыдущая емкость, «хотите», если вы делаете его намного меньше и хотите, чтобы он был обрезан для экономии памяти).
За исключением того, что он ** может быть оптимизирован для определенных типов и категорий итераторов (даже если это маловероятно). –
Я бы рекомендовал этот метод. –