将std::array的std::数组传递给函数

C++ Passing through a function an std::array of std::array

本文关键字:std 函数 array 数组      更新时间:2023-10-16

我是新的std::数组。我必须创建这个函数

void foo(std::array < std::array <double, a>& , b> & previous)

,其中a和b是两个固定整数值。我该怎么办?

提前感谢!

变量" ab 必须为编译时常量。如果您希望它们在运行时是可变的或设置的,则必须使用std::vector

模板参数(如std::array的参数)必须在编译时知道。一般来说,你可以编写一个基于这两种大小模板化的函数,例如:

template <std::size_t N, std::size_t M>
void foo(std::array<std::array<double, N>, M> &previous) {
    // code goes here, e.g.:
    previous[M - 1][N - 1] = static_cast<double>(M * N);
}

模板参数将由函数参数类型推断,所以你的数组数组可以有任何你想要的维度,你不需要在调用foo时指定它们。

std::array<std::array<double, 10>, 20> my_array;
foo(my_array); // equivalent to foo<10, 20>(my_array);
顺便说一下,如果你想让你的程序健壮或快速,使用std::vector<std::vector<T>>是一个非常糟糕的主意。您不仅必须手动管理和仔细跟踪每个内部vector的长度,而且由于单独堆分配N M长度数组而不是单个N x M长度数组,您的性能也会受到巨大影响。

如前所述,您可以在编译时执行维度和类型的推导。

template <typename Scalar, std::size_t I, std::size_t J>
void
Foo(std::array<std::array<Scalar, I>, J>& previous) {
}
int main() {
        std::array<std::array<double, 10>, 20> data;
        Foo(data);
}

或者,您可以将此数据视为矩阵。

template <typename Scalar>
class Matrix {
public:
    Matrix(std::size_t rows, std::size_t cols)
        : rows(rows)
        , cols(cols)
        , data(rows * cols, Scalar(0))
    {}
    Scalar&
    at(std::size_t row, std::size_t col) {
        std::size_t n = (row * cols) + col;
        return data.at(n);
    }
private:
    std::size_t rows;
    std::size_t cols;
    std::vector<Scalar> data;
};
int main() {
        Matrix<double> m(3, 3);
        m.at(2, 2) = 3;
}

ab必须在编译时已知。您可以将它们声明为

constexpr int a = 10;
constexpr int b = 100;

如果不可能在编译时知道这两个变量,你必须使用std::vectors来代替:

typedef std::vector< const std::vector > Matrix;
void f( const Matrix& m );