1

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

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

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

先感谢您!

4

4 回答 4

0

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

于 2014-03-12T13:46:09.897 回答
0

模板参数(例如 to 的参数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>>如果您希望您的程序健壮或快速,那么使用是一个可怕的想法。您不仅必须手动管理和仔细跟踪每个 inner的长度,而且还会因单独的堆分配长度数组而不是单个长度数组而vector遭受巨大的性能损失。N MN x M

于 2016-09-25T23:52:11.980 回答
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;
}
于 2016-09-26T01:39:16.157 回答
-1

a并且b必须在编译时知道。您可以将它们声明为

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

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

typedef std::vector< const std::vector > Matrix;
void f( const Matrix& m );
于 2014-03-12T13:47:44.533 回答