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

时间:2011-04-24 20:40:02

标签: c++ arrays multidimensional-array

我尝试使用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。

有可能吗?

感谢您的帮助。

最诚挚的问候, 埃姆雷。

3 个答案:

答案 0 :(得分:1)

编辑:刚刚注意到您正在使用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]...

使用typedef也许事情看起来更好(即使我不是100%肯定我在最后一个例子中得到了那个数组ceclaration ...):

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

BTW,你当前代码不起作用的原因是

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

答案 1 :(得分:1)

如果您使用的是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

答案 2 :(得分:1)

一组多维数组与具有一个维度的多维数组相同。

此外,关于内置数组的一些事情:

  • 在C ++中,内置数组维度必须基于编译时常量。您无法计算大小,从文件中读取,从用户输入获取等等
  • 要创建具有可变大小的内置数组,必须分配内存,并将其用作指针
  • 要让内置数组的分配在C和C ++之间可移植,您必须使用malloc,并确保稍后在free获取的所有内容上调用malloc (有时候很难做对)

如果您使用的是C ++,并且不需要使用C编译器编译代码,我建议使用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,
  (3,0) - 0,(3,1) - 0,(3,2) - 0,(3,3) - 0,

     

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

修改

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

如果您的现有代码一次只能接受一行,那么上述解决方案将起作用。如果它只能接受二维数组,则必须使用不同的向量结构。看到这个问题的原因:

Pass nested C++ vector as built-in style multi-dimensional array

如果你需要一组连续的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]);