我是新來的std :: array。我必須創建這個功能C++通過函數std :: array std :: array
void foo(std::array < std::array <double, a>& , b> & previous)
其中a和b是兩個固定的整數值。 我該怎麼辦?
預先感謝您!
我是新來的std :: array。我必須創建這個功能C++通過函數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>>
是,如果你想你的程序是可靠或快速可怕,可怕的想法。您不僅需要手動管理並仔細跟蹤每個內部的長度,還可以單獨分配長度較長的陣列而不是單個長度的陣列,從而獲得巨大的性能。
正如所提到的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'。 – Oktalist
第一個(「內部」)'&'似乎放錯了位置,而不是如果你真的在數組引用之後(這似乎不太可能)。 –
謝謝你,你是對的! – ThePunisher