2011-03-10 1 views
6

Я выделил большой двойной вектор, скажем, с помощью 100000 элементов. В какой-то момент в моем коде я хочу, чтобы все элементы были постоянными, отличными от нуля. Как я могу это сделать без использования цикла for для всех элементов? Я также использую пакет blas, если это помогает.Инициализировать двойной массив с ненулевыми значениями (blas)

ответ

9

Вы можете использовать std::fill (#include <algorithm>):

std::fill(v.begin(), v.end(), 1); 

Это, по существу, также только петля конечно ..

+0

За исключением того, что он ** может быть оптимизирован для определенных типов и категорий итераторов (даже если это маловероятно). –

+0

Я бы рекомендовал этот метод. –

0

Вы всегда использовать 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 теперь может выбрать лучший алгоритм (цикл, развернутый цикл, инструкция с префиксом или вызов библиотеки) на основе размер скопированного блока и для оптимизации процессора.

+0

-1: У него есть двойной вектор и memset для двойного вектора (я могу понять, что это смежный массив под вектором), когда он специально хочет, чтобы это ненулевое значение не было тривиальным. Значение, которое может быть установлено с помощью memset, представляет собой байт (размер unsigned char), а константа, которую он хочет установить, равна 4 байтам. –

+0

Пропущенный двойной вектор во время чтения. Если ему нужны все 4 байта, то да, этого не будет. С другой стороны, он, вероятно, хочет отметить их как «неиспользуемые», и один байт может сделать трюк. – Milan

+0

Я не вижу, чтобы OP упоминал об этом. Но, если быть точным с его вопросом, я считаю, что std :: fill - его лучший выбор. –

3

«fill» находится прямо от того, что вы сказали.

Имейте в виду, что это также можно построить вектор полный заданного значения:

std::vector<double> vec(100000, 3.14); 

Так что если «в какой-то момент» означает «сразу после окончания строительства», сделать это вместо этого. Кроме того, это означает, что вы можете сделать это:

std::vector<double>(100000, 3.14).swap(vec); 

, которые могут быть полезны, если «в какой-то момент» означает «сразу после изменения размера», и вы ожидаете/хотите вектор быть перераспределены («ожидать», если вы делаете его больше, чем его предыдущая емкость, «хотите», если вы делаете его намного меньше и хотите, чтобы он был обрезан для экономии памяти).

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

  • Нет связанных вопросов^_^