首页 > 解决方案 > 在 C++ 中返回二维数组

问题描述

我是 C++ 的新手,我在 python 中进行物理模拟,这需要永远完成,所以我决定切换到 C++,我不明白如何创建一个返回 2D 数组(或 3D 数组)的函数)

#include <iostream>
#include <cmath>
// #include <complex> //

using namespace std;

double** psiinit(int L, int n, double alpha){
    double yj[400][400] = {};
    for (int j = 0; j < n; j++)
    {
        double xi[400] = {};
        for (int i = 0; i < n; i++)
        {
            xi[i] = exp(-(pow((i-(L/4)), 2) + (pow((j-(L/4)), 2)))/alpha) / (sqrt(2)*3.14159*alpha);
        };
        yj[j] = xi;
    };
    return yj;
}

int main(){
    int L = 10;
    int n = 400;
    int nt = 200*n;
    double alpha = 1;
    double m = 1;
    double hbar = 1;

    double x[n] = {};
    double y[n] = {};
    double t[nt] = {};

    double psi[nt][n][n] = {};
    psi[0] = psiinit(L, n, alpha);

    cout << psi <<endl;
    return 0;
}

我一直在寻找答案,但似乎不适用于我的问题

谢谢

标签: c++arraysmultidimensional-arrayreturn

解决方案


如果您是 C++ 新手,您应该阅读堆和堆栈的概念以及堆栈帧。有很多很好的资源。

简而言之,当你声明一个 C 风格的数组(yj比如返回的数组。

有 3 个选项:

  1. 将数组作为输出参数传递给函数(非常 C 风格,不推荐)。
  2. 将数组包装在一个类中(就像std::array已经为您所做的那样),在这种情况下,它保留在堆栈上,并在返回时被复制到调用框架,但是它的大小必须在编译时知道。
  3. 在堆上分配数组并返回它,在我看来这最适合你的情况。std::vector为您做到这一点:
std::vector<std::vector<double>> psiinit(int L, int n, double alpha){
    std::vector<std::vector<double>> yj;
    for (int j = 0; j < n; j++)
    {
        std::vector<double> xi;
        for (int i = 0; i < n; i++)
        {
            const int value = exp(-(pow((i-(L/4)), 2) + (pow((j-(L/4)), 2)))/alpha) / (sqrt(2)*3.14159*alpha);
            xi.push_back(value);
        }

        yj.push_back(xi);
    }
    return yj;
}

如果您关心性能并且所有内部向量的大小都是固定的N,那么使用std::vector<std::array<double, N>>.


推荐阅读