在c++中使用for循环初始化一系列数组



我尝试用for循环创建一系列多维数组。用户应输入要初始化的数组数。我想要这样写:

int i;
printf("Enter the number of arrays you want: ");
scanf("%d",i)
for(int j=0;j<i;j++){
     long double x(j)[size][size];
}

如果我输入5,我希望得到x0 x1 x2 x3和x4

这是可能的吗?

谢谢你的帮助。

最诚挚的问候,埃姆雷.

Edit:刚刚注意到您正在使用c++。在这种情况下,std::vector绝对是最方便的解决方案。如果您对如何使用C风格的普通数组实现这一点感到好奇,请阅读…


你不能这样做。你需要做的是创建一个三维数组(或者一个二维数组的数组,这取决于你的观点…)

和C语言一样,内存分配是一个痛苦的过程。你可以静态地分配:

long double x[N][size][size];

(N在编译时确定。确保你有足够大的。另外,如果N真的很大,可以静态地声明数组(作为全局变量或使用static关键字)。如果你不这样做,你可能会得到堆栈溢出。)

或者你可以使用动态内存分配:

long double (*x)[size][size]; // x is a pointer to size by size arrays
x = malloc(n * sizeof(*x));
//You can now use x[j][a][b]...

也许事情看起来更好的类型定义(即使我不是100%确定我得到了数组声明正确的最后一个例子…):

typedef long double typename_here[size][size];
typename_here *x;
x = malloc(n * sizeof(typename_here);

顺便说一句,你当前的代码不能工作的原因是

  1. x(j)语法是虚构的:)
  2. 在循环中声明的变量是该块的内部变量。这意味着你不能在循环体之后访问它们。

如果你在c++中工作,你最好应该使用std::vector作为:

//single dimensional array of double of size 20
std::vector<double>  v1double (20);      
//use like v[i] where  0 <= i < 20
//two dimensional array of double of size  (10 * 20)
std::vector<std::vector<double> >  v2double(10, v1double ); 
//use like v[i][j] where  0 <= i < 10 and 0 <= j < 20
//three dimensional array of double of size (5 * 10 * 20)
std::vector<std::vector<std::vector<double> >  v3double (5, v2double); 
//use like v[i][j][k] where  0 <= i < 5 and 0 <= j < 10 and 0 <= k < 20

一组多维数组就是多了一个维度的多维数组。

还有,关于内置数组的一些事情:
    在c++中,内置数组的尺寸必须基于编译时常数。你不能计算大小,从文件中读取它,从用户输入中获取它,等等
  • 要创建一个可变大小的内置数组,你必须分配内存,并像使用指针一样使用它
  • 要在C和c++之间可移植内置数组的分配,必须使用malloc,并确保稍后在从malloc获得的所有内容上调用free(有时很难获得正确)

如果你正在使用c++,并且不需要用C编译器编译你的代码,我建议使用vector而不是内置数组。vector不必有固定的大小,只要你想调整它们的大小就可以调整,通常不需要在代码中调用mallocnew

一种方法是:
#include<iostream>
#include<vector>
int main(int argc, char* argv[])
{
    std::cout << "Enter the number of arrays you want:" << std::endl;
    const int size = 4;
    const int initial_value = 0;
    int i;
    std::cin >> i;
    std::vector<int> sub_sub_array(size, initial_value);
    std::vector<std::vector<int> > sub_array(size, sub_sub_array);
    std::vector<std::vector<std::vector<int> > > array(i, sub_array);
    array[0][1][2] = 5;
    // Print out the full array contents
    for(size_t i = 0; i < array.size(); ++i)
    {
        for(size_t j = 0; j < size; ++j)
        {
            for(size_t k = 0; k < size; ++k)
            {
                std::cout << "(" << j << ", " << k << ") - " << array[i][j][k] << ", ";
            }
            std::cout << "n";
        }
        std::cout << "n";
    }
}

输入数组的个数:
2

(0,0) - 0 (0,1) - 0 (0, 2) - 0, (0, 3) - 0,
(1,0) - 0,(1,1) - 0(1、2)—— 5 , (1,3) - 0,
(2,0) - 0, (2, 1) - 0, (2, 2) - 0, (2,3) - 0,
(0) 3 - 0, (3,1) - 0, (2) - 0, (3,3) - 0,

(0,0) - 0 (0,1) - 0 (0, 2) - 0, (0, 3) - 0,
(1,0) - 0,(1,1) - 0 - 0(1、2),(1,3)- 0,
(2,0) - 0, (2, 1) - 0, (2, 2) - 0, (2,3) - 0,
(0) 3 - 0, (3,1) - 0, (2) - 0, (3,3) - 0,

编辑:

上述解决方案的唯一问题是,您可能会或可能不会在需要内置数组的代码中使用它。从你的评论来看,你需要它。

如果您现有的代码可以一次接受一行,那么上述解决方案将工作。如果它只能接受2d数组,你就必须使用不同的矢量结构。看这个问题的原因:

传递嵌套c++ vector作为内置风格多维数组

如果您需要一组连续的2d数组,这里有一些选项:

std::vector<int*> array_instances(i);
for(size_t j = 0; j < array_instances.size(): ++j)
    array_instances[j] = new int[size * size];
for(size_t j = 0; j < array_instances.size(); ++j)
    existing_code(array_instances[j]);
// When done with the arrays
for(size_t j = 0; j < array_instances.size(): ++j)
    delete[] array_instances[j]; // Make sure to include the brackets after "delete"

或:

std::vector<int> template_array(size * size, 0);
std::vector<std::vector<int> > array_instances(i, template_array);
for(size_t j = 0; j < array_instances.size(); ++j)
    existing_code(&array_instances[j][0]);

最新更新