将大型二维数组初始化为C+中的所有一个值+; < P>我想初始化C++中的一个大的二维数组(比如说1000 x1000,虽然我想更大)到所有的 -1 。p>

将大型二维数组初始化为C+中的所有一个值+; < P>我想初始化C++中的一个大的二维数组(比如说1000 x1000,虽然我想更大)到所有的 -1 。p>,c++,arrays,C++,Arrays,如果我的数组是一维的,我知道我可以: int my_array[1000]; memset(my_array, -1, sizeof(my_array)); 但是,memset不允许将一个数组的所有元素初始化为另一个数组。我知道我可以制作一个长度为1000000的一维数组,但为了可读性,我更喜欢二维数组。我也可以在将二维数组初始化为all0后,通过循环来设置值,但这段代码将在我的程序中运行很多次,我不确定这会有多快。实现这一目标的最佳方式是什么 编辑以添加最小可复制示例: int my_arr

如果我的数组是一维的,我知道我可以:

int my_array[1000];
memset(my_array, -1, sizeof(my_array));
但是,
memset
不允许将一个数组的所有元素初始化为另一个数组。我知道我可以制作一个长度为1000000的一维数组,但为了可读性,我更喜欢二维数组。我也可以在将二维数组初始化为all
0
后,通过循环来设置值,但这段代码将在我的程序中运行很多次,我不确定这会有多快。实现这一目标的最佳方式是什么

编辑以添加最小可复制示例:

int my_array[1000][1000];
// I want my_array[i][j] to be -1 for each i, j

如果数组是静态的,则将其放入顺序内存(检查)。所以char[1000][1000]等于char[1000000](如果堆栈可以容纳那么多)

如果数组是用多维new(比如
char(*x)[5]=new char[5][5]
)创建的,那么它也是连续的


如果不是(如果使用动态分配创建),则可以使用中找到的解决方案在memsetd后将n维数组映射到单个数组。

如果数组是静态的,则将其放置在顺序内存中(选中)。所以char[1000][1000]等于char[1000000](如果堆栈可以容纳那么多)

如果数组是用多维new(比如
char(*x)[5]=new char[5][5]
)创建的,那么它也是连续的

如果不是(如果您使用动态分配创建它),那么您可以使用中找到的解决方案在memsetd之后将n维数组映射到单个数组。

使用GNU GCC,您可以:

int my_array[1000][1000] = { [0 .. 999] = { [0 .. 999] = -1, }, };
对于任何其他编译器,您需要:

int my_array[1000][1000] = { { -1, -1, -1, .. repeat -1 1000 times }, ... repeat { } 1000 times ... };
旁注:以下内容是执行分配,而不是初始化:

int my_array[1000][1000];
for (auto&& i : my_array) 
    for (auto&& j : i)
        j = -1;
使用GNU GCC编写代码和为(int i=0;i而编写代码之间有什么真正的区别吗?您可以:

int my_array[1000][1000] = { [0 .. 999] = { [0 .. 999] = -1, }, };
对于任何其他编译器,您需要:

int my_array[1000][1000] = { { -1, -1, -1, .. repeat -1 1000 times }, ... repeat { } 1000 times ... };
旁注:以下内容是执行分配,而不是初始化:

int my_array[1000][1000];
for (auto&& i : my_array) 
    for (auto&& j : i)
        j = -1;

做你写的和为你做的有什么区别吗(inti=0;i我有点惊讶

我知道,它是C++。我决不会使用普通的C样式数组。 因此,公认的答案可能是最好的

但是,如果我们回到问题上来

int my_array[1000];
memset(my_array, -1, sizeof(my_array));

那么最简单、最快的解决方案与原始假设相同:

int my_array[1000][1000];
memset(my_array, -1, sizeof(my_array));
没有区别。编译器甚至会对此进行优化,并使用快速汇编循环指令

Sizeof足够聪明。它会做到这一点。而且内存是连续的:所以,它会工作。快速。简单

(一个好的编译器会对其他解决方案进行同样的优化)


请考虑。

< P>我有点惊讶。

我知道,它是C++。我决不会使用普通的C样式数组。 因此,公认的答案可能是最好的

但是,如果我们回到问题上来

int my_array[1000];
memset(my_array, -1, sizeof(my_array));

那么最简单、最快的解决方案与原始假设相同:

int my_array[1000][1000];
memset(my_array, -1, sizeof(my_array));
没有区别。编译器甚至会对此进行优化,并使用快速汇编循环指令

Sizeof足够聪明。它会做到这一点。而且内存是连续的:所以,它会工作。快速。简单

(一个好的编译器会对其他解决方案进行同样的优化)


请考虑。

如果数组是静态的,它是放置在顺序内存中的?是什么意思?所有数组都是在相邻的内存中。他可能意味着类似这样的可能性“代码> int *数组(1000)。,其中每个值都被初始化为另一个数组。@NathanOliver,当你有一个动态多维数组时,你不能将它放在连续内存中。
char**a;a=new char[10];for(int i=0;i<10;i++)a[i]=new char[100];
-不是连续内存。真的保证
char[10][10]
是否连续?@MichaelChourdakis关于您的更新:
char**x=new char[5][5]
不合法。
new char[5][5]
返回一个
char(*)[5]
,而不是
字符**
。如果数组是静态的,那么它放在顺序内存中是什么意思?所有数组都在连续内存中。他可能指的是类似于
int*数组[1000]的可能性
,其中每个值都被初始化为另一个数组。@NathanOliver,当你有一个动态多维数组时,你不能将它放在连续内存中。
char**a;a=new char[10];for(int i=0;i<10;i++)a[i]=new char[100];
-不是连续内存。真的保证
char[10][10]
是否连续?@MichaelChourdakis关于您的更新:
char**x=new char[5][5]
不合法。
new char[5][5]
返回一个
char(*)[5]
,而不是
字符**
。请提供-声明的2D数组以及您希望如何初始化它。如果您关心速度,2D数组可以存储在1D中并适当索引。通过二维循环。只要您不做任何花哨的事,您的优化器应该优化此代码。请注意,1,000000
int
s将超过许多系统上可用的自动存储空间。请提供-声明的2D数组以及您希望如何初始化它。如果您关心速度,2D数组可以存储在1D中并适当索引。通过二维循环。只要您不做任何花哨的事情,您的优化er应该很好地优化此代码。请注意,1000000
int
s将超过许多系统上可用的自动存储空间。谢谢。我以前从未见过
auto
。执行您编写的操作和执行
的操作之间有什么真正的区别吗(inti=0;iThanks。我以前从未见过
auto
。d之间有什么真正的区别吗