我在C中有一个大数组(不是c++,如果这有区别的话)。我想初始化相同值的所有成员。
我发誓我曾经知道一个简单的方法。在我的情况下,我可以使用memset(),但没有一种方法来做到这一点,这是建立在C语法?
我在C中有一个大数组(不是c++,如果这有区别的话)。我想初始化相同值的所有成员。
我发誓我曾经知道一个简单的方法。在我的情况下,我可以使用memset(),但没有一种方法来做到这一点,这是建立在C语法?
当前回答
作为Clemens Sielaff回答的后续。这个版本需要c++ 17。
template <size_t Cnt, typename T>
std::array<T, Cnt> make_array_of(const T& v)
{
return []<size_t... Idx>(std::index_sequence<Idx...>, const auto& v)
{
auto identity = [](const auto& v, size_t) { return v; };
return std::array{identity(v, Idx)...};
}
(std::make_index_sequence<Cnt>{}, v);
}
你可以在这里看到它的作用。
其他回答
int i;
for (i = 0; i < ARRAY_SIZE; ++i)
{
myArray[i] = VALUE;
}
我觉得这比
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5...
以防数组的大小发生变化。
在过去(我并不是说这是个好主意),我们设置了第一个元素,然后:
Memcpy (&element [1], &element [0], sizeof (element)-sizeof (element [0]);
甚至不确定它是否还能工作(这将取决于memcpy的实现),但它通过重复地将初始元素复制到下一个元素来工作-甚至对结构数组也有效。
有一个快速的方法来初始化任何类型的数组与给定的值。它在大型阵列上工作得非常好。算法如下:
初始化数组的第一个元素(通常的方式) 将已设置的部分复制为未设置的部分,每次复制操作都将大小增加一倍
对于1 000 000个数组元素,它比常规循环初始化快4倍(i5, 2核,2.3 GHz, 4GiB内存,64位):
循环运行时间0.004248[秒]
Memfill()运行时间0.001085[秒]
#include <stdio.h>
#include <time.h>
#include <string.h>
#define ARR_SIZE 1000000
void memfill(void *dest, size_t destsize, size_t elemsize) {
char *nextdest = (char *) dest + elemsize;
size_t movesize, donesize = elemsize;
destsize -= elemsize;
while (destsize) {
movesize = (donesize < destsize) ? donesize : destsize;
memcpy(nextdest, dest, movesize);
nextdest += movesize; destsize -= movesize; donesize += movesize;
}
}
int main() {
clock_t timeStart;
double runTime;
int i, a[ARR_SIZE];
timeStart = clock();
for (i = 0; i < ARR_SIZE; i++)
a[i] = 9;
runTime = (double)(clock() - timeStart) / (double)CLOCKS_PER_SEC;
printf("loop runtime %f [seconds]\n",runTime);
timeStart = clock();
a[0] = 10;
memfill(a, sizeof(a), sizeof(a[0]));
runTime = (double)(clock() - timeStart) / (double)CLOCKS_PER_SEC;
printf("memfill() runtime %f [seconds]\n",runTime);
return 0;
}
如果你的编译器是GCC,你可以使用以下“GNU扩展”语法:
int array[1024] = {[0 ... 1023] = 5};
查看详细描述: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html
用0初始化
char arr[1000] = { 0 };
最好使用普通的“for循环”来进行除0以外的初始化。
char arr[1000];
for(int i=0; i<arr.size(); i++){
arr[i] = 'A';
}