[英]C++ Passing through a function an std::array of std::array
我是std :: array的新手。 我必須創建此功能
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 );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.