C ++通过函数传递std :: array的std :: array

时间:2014-03-12 13:40:52

标签: c++ stdarray

我是std :: array的新手。我必须创建这个功能

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

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

提前谢谢!

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

模板参数(例如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 - 长度数组。

答案 2 :(得分:0)

如上所述pmttavara,您可以执行尺寸和类型的编译时扣除。

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;
}

答案 3 :(得分:-1)

必须在编译时知道

ab。您可以将它们声明为

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

如果在编译时无法知道这两个变量你必须改为使用std::vectors

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