Подтвердить что ты не робот

С++ - самый быстрый способ установки массива поплавков на одно и то же значение

Я наивно думал, что могу использовать memset для этого, но, по-видимому, memset предназначен только для символов. Есть ли тип memset-типа, который будет работать с массивом поплавков? Или простая итерация - самый быстрый способ скопировать одно значение в каждое место в массиве?

4b9b3361

Ответ 1

Я не буду говорить, какой код работает быстрее всего. Вы должны сравнить их самостоятельно, в предполагаемой среде.

Но вот два читаемых, поддерживаемых, правильных решения.

std::fill(std::begin(array), std::end(array), 3.14);

Или, если у вас есть динамический массив:

std::fill(array, array+size, 3.14);

Ответ 2

Стандартный способ:

std::fill(float_array, float_array + array_size, 0.0f);

Я подозреваю, что вы можете обыграть это стандартное средство без нестандартных методов.

Ответ 3

Я бы порекомендовал std::fill.

std::fill(
    floatArray + 0, floatArray + LENGTH
  , newValue
);

Компилятор знает, что вы пытаетесь сделать здесь, и достойные реализации могут обеспечить соответствующие оптимизации.

Ответ 4

Вам просто нужно выполнить цикл и установить все значения в 0 (что и есть memset):

// this is a generic function to set all the elements of an array of any type (that has a public assignment operator and copy constructor) to a specific value
template<typename T>
void setarray(T* array, const T val, unsigned int array_size) {
    for (unsigned int i = 0; i < array_size; ++i)
        array[i] = val;
}

float* floatArray = new float[x];

setarray(floatArray, 0, x);

Если конкретное значение, которое вы хотите установить для всех элементов массива, будет 0, и вы используете массив времени компиляции, вы можете использовать список инициализации:

float myArray[CONSTANT] = {}; // all values are 0

Ответ 5

Существует функция memfill http://manpages.ubuntu.com/manpages/natty/man3/memfill.3pub.html

в публичной нестандартной библиотеке. Его можно использовать в ubuntu.

 #include <publib.h>

   float a=4.4;
   memfill(buf_ptr, buf_size, &a, sizeof(float) );

Ответ 6

Вы можете использовать потоки и инициализировать поддиапазоны отдельными потоками.