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
을 사용해야합니다.
a
및 b
은 컴파일시 알려야합니다. 컴파일 시간에 대신 std::vectors
를 사용해야 할이 두 변수를 알 수없는 경우 당신은
constexpr int a = 10;
constexpr int b = 100;
로 선언 할 수 있습니다 (예 : std::array
에 대한 것과 같은)
typedef std::vector< const std::vector > Matrix;
void f(const Matrix& m);
템플릿 인수를해야합니다 컴파일시 알려진. 일반적으로 말해서, 당신은 두 가지 크기에 템플릿되는 함수, 예를 들어 작성할 수 있습니다
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::vector<std::vector<T>>
를 사용하는 방식으로
std::array<std::array<double, 10>, 20> my_array;
foo(my_array); // equivalent to foo<10, 20>(my_array);
, 당신은 당신의 프로그램이 강력한 또는 빨리하려는 경우 끔찍한, 끔찍한 생각이다. 각 내부
vector
의 길이를 수동으로 관리하고 신중하게 추적해야 할뿐만 아니라,
N x M
길이 배열이 아닌
N
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'가 없습니다. – Oktalist
첫 번째 ("내부")'&'는 잘못 배치 된 것처럼 보입니다. 대신 배열 참조 배열 (실제로는 없을 것 같습니다)을 따르는 경우입니다. –
감사합니다. 당신 말이 맞습니다! – ThePunisher