【问题标题】:Initializing series of arrays with for loops at C++在 C++ 中使用 for 循环初始化一系列数组
【发布时间】:2011-04-24 20:40:02
【问题描述】:

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

有可能吗??

感谢您的帮助。

最好的问候, 埃姆雷。

【问题讨论】:

  • x0, x1, x2,.. ?如果你不知道你在玩多少个变量,你打算如何使用这些变量?
  • @unapersson @Tomalak Geret'kal 我正在使用 C++。

标签: c++ arrays multidimensional-array


【解决方案1】:

编辑:刚刚注意到您使用的是 C++。在这种情况下,std::vector 绝对是最方便的解决方案。如果您对如何使用 C 风格的普通数组执行此操作感到好奇,请继续阅读...


你不能这样做。您需要做的是创建一个 3 维数组(或 2 维数组的数组,取决于您的观点...)

与 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% 确定我在上一个示例中得到了正确的数组声明......):

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

顺便说一句,您当前的代码不起作用的原因是

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

【讨论】:

  • 谢谢。我知道如何用 typedef 和所有这些来初始化数组。我只需要一系列也可以并行工作的数组。我有一个适用于 4D 数组的科学计算代码,现在我只是不想修改我的所有代码以使其成为 5D 以覆盖这些额外的元素。再次感谢您的回答。
  • @Emre:您可能能够在外部代码中创建外部数组,遍历该顶级数组,获取最外部的子数组,并将其传递给您现有的代码。 for(int i = 0; i &lt; outer_most_array_size; ++i) { my_existing_code_that_takes_multi_dimensional_array(nested_array[i]); }
  • 尝试创建std::vector&lt;long double [size][size]&gt;。这样,您可以在享受 C++ 向量的便利的同时保持向后兼容性。 (如果 sintax 不能完全像那样工作,那么 std::vector&lt;my_typedef&gt; 应该可以解决问题......)
【解决方案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

【讨论】:

  • 谢谢,但我的问题不是如何创建多维数组。也许我以错误的方式表达自己。无论如何,谢谢。
【解决方案3】:

一组多维数组与多维的多维数组是一回事。

另外,关于内置数组的几点说明:

  • 在 C++ 中,内置数组维度必须基于编译时间常数。您无法计算大小、从文件中读取大小、从用户输入中获取大小等
  • 要创建可变大小的内置数组,必须分配内存,并像指针一样使用它
  • 要使内置数组的分配能够在 C 和 C++ 之间移植,您必须使用 malloc,并确保稍后对从 malloc 获得的所有内容调用 free(有时可能非常很难做到正确)

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

编辑:

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

如果您现有的代码一次可以接受一行,那么上述解决方案将有效。如果它只能接受二维数组,则必须使用不同的向量结构。请参阅此问题了解原因:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多