나는 당신의 값을 포함하는 크기 rows * cols
의 단일 std::vector
을 사용하는 것이 좋습니다 것입니다. 그럼 당신은 진보에 의해 주어진 (row, col)
에 액세스 할 수 있습니다
#include <iostream>
#include <vector>
class Matrix {
public:
Matrix(std::size_t rows, std::size_t cols)
: m_data(rows * cols),
m_rows(rows),
m_cols(cols) { }
long operator()(std::size_t row, std::size_t col) const {
return m_data[row * m_cols + col];
}
long& operator()(std::size_t row, std::size_t col) {
return m_data[row * m_cols + col];
}
// other methods here...
private:
std::vector<long> m_data;
std::size_t m_rows;
std::size_t m_cols;
};
int main() {
std::size_t rows = 3;
std::size_t cols = 6;
long value = 0;
Matrix A(rows, cols);
// fill
for(std::size_t row = 0; row < rows; ++row) {
for(std::size_t col = 0; col < cols; ++col) {
A(row, col) = value++;
}
}
// print
for(std::size_t row = 0; row < rows; ++row) {
for(std::size_t col = 0; col < cols; ++col) {
std::cout << A(row, col) << " ";
}
std::cout << std::endl;
}
return 0;
}
일부 장점 : 모두가 기본이 std::vector
모든 요소에 의해 관리되는대로이
- 당신은 메모리 관리에 대해 걱정할 필요가 없습니다 메모리에 인접 해 있으며 저장 패턴을 선택할 수 있습니다 (행 메이저를 표시했지만 열 메이저가 필요할 수도 있음). 액세스 패턴에 따라 성능을 향상 시키십시오.
- 클래스를 손쉽게 수정하여 템플릿 매개 변수와는
가 표기 A[M][N]
컴파일러에만 의미가 C++에서 그 기억 당신의 유형을 변경하고, 궁극적으로 행 주요 순서로 메모리 A[M * N]
의 선형 세그먼트가 발생합니다.
* 초기화 *는 일반적으로 "데이터로 채우기"를 의미하지만 여기에는 해당되지 않습니다. * 2D 배열을 할당하고자하는 것처럼 보이지만, 그렇게하지 않으면'matrix'에 어떤 변화가 생길 것입니다. 가장 가까운 것은'matrix [x] [y]'이다. 이것은 배열의 존재하지 않는 요소에 대한 참조이다. –
그래, 그걸 시도했지만 x/y 값이 없기 때문에 나에게 오류가 발생한다. – Ipawnu43
컴파일 할 때 크기를 알아야합니다. 그 주위에 방법이 없습니다. 또는 동적 크기의 2D 배열 유형을 구현할 수 있습니다. – juanchopanza