我是std :: array的新手。我必须创建这个功能
void foo(std::array < std::array <double, a>& , b> & previous)
其中a和b是两个固定的整数值。 我该怎么办?
提前谢谢!
答案 0 :(得分:0)
“变量”a
和b
必须是编译时常量。如果您希望它们在运行时变量或设置,则必须改为使用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)
a
和b
。您可以将它们声明为
constexpr int a = 10;
constexpr int b = 100;
如果在编译时无法知道这两个变量你必须改为使用std::vectors
:
typedef std::vector< const std::vector > Matrix;
void f( const Matrix& m );