将std::array的std::数组传递给函数
C++ Passing through a function an std::array of std::array
我是新的std::数组。我必须创建这个函数
void foo(std::array < std::array <double, a>& , b> & previous)
,其中a和b是两个固定整数值。我该怎么办?
提前感谢!
变量" a
和b
必须为编译时常量。如果您希望它们在运行时是可变的或设置的,则必须使用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;
}
a
和b
必须在编译时已知。您可以将它们声明为
constexpr int a = 10;
constexpr int b = 100;
如果不可能在编译时知道这两个变量,你必须使用std::vectors
来代替:
typedef std::vector< const std::vector > Matrix;
void f( const Matrix& m );
相关文章:
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数