我是 std::array 的新手。我必须创建这个功能
void foo(std::array < std::array <double, a>& , b> & previous)
其中 a 和 b 是两个固定整数值。我应该怎么做?
先感谢您!
“变量”必须是编译时常a
量。如果您希望它们在运行时可变或设置,则必须改用。b
std::vector
模板参数(例如 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
M
N x M
正如提到的 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;
}
a
并且b
必须在编译时知道。您可以将它们声明为
constexpr int a = 10;
constexpr int b = 100;
如果在编译时无法知道这两个变量,则必须std::vectors
改用:
typedef std::vector< const std::vector > Matrix;
void f( const Matrix& m );