C ++ - 将浮点数组设置为相同值的最快方法

时间:2011-11-18 19:41:33

标签: c++

我天真地以为我可以使用memset,但显然memset只适用于字符。是否有一个memset类型的东西可以在浮点数组上工作?或者简单的迭代是将单个值复制到数组中每个点的最快方法吗?

7 个答案:

答案 0 :(得分:32)

我不会说最快的代码。您应该在预期的环境中自己比较它们。

但是,这是两个可读,可维护,正确的解决方案。

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

或者,如果您有动态数组:

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

答案 1 :(得分:4)

标准方式是:

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

我怀疑你可以在没有非标准方法的情况下击败这个标准设施。

答案 2 :(得分:4)

我建议std::fill

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

编译器知道你在这里尝试做什么,而不错的实现可以提供合适的优化。

答案 3 :(得分:2)

你只需循环并将所有值设置为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

答案 4 :(得分:1)

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) );

答案 5 :(得分:0)

您可以使用线程并使用单独的线程初始化子范围。

答案 6 :(得分:-1)

如果您具有多维浮点数组,则可以执行以下操作:

float myMultiDimensionFloats[5][250];
float myfloats[250];

for(int i=0; i<250;i++)
    myfloats[i] = 3.14f; // the value you want to store in each float entry

for(int ii=0; ii<5; ii++)
    CopyMemory(myMultiDimensionFloats[ii], &myfloats, sizeof(myMultiDimensionFloats[ii]));

或者如果您想使用“ Seth Carnegie”中的模板:

#define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))
float myMultiDimensionFloats[5][250];
setarray(myMultiDimensionFloats[0], 3.14f, LEN(myMultiDimensionFloats) * LEN(myMultiDimensionFloats[0]));