2014-11-17 2 views
2

어떻게 2 차원 배열을 초기화할까요? 다차원 배열에 대한 내 차원에 대한 경계가 있어야한다고 나와 있습니다.클래스의 2 차원 배열 초기화

헤더 :

Class MyClass{ 
private: 
    long x; 
    long y; 
    long matrix[][]; 
public: 
    MyClass(long x, long y); 
} 

소스 :

MyClass:MyClass(long a, long b){ 
    x = a; 
    y = b; 
    matrix[x][y]; 
} 

이 내가 할 노력하고 있어요 것입니다.

+0

* 초기화 *는 일반적으로 "데이터로 채우기"를 의미하지만 여기에는 해당되지 않습니다. * 2D 배열을 할당하고자하는 것처럼 보이지만, 그렇게하지 않으면'matrix'에 어떤 변화가 생길 것입니다. 가장 가까운 것은'matrix [x] [y]'이다. 이것은 배열의 존재하지 않는 요소에 대한 참조이다. –

+0

그래, 그걸 시도했지만 x/y 값이 없기 때문에 나에게 오류가 발생한다. – Ipawnu43

+0

컴파일 할 때 크기를 알아야합니다. 그 주위에 방법이 없습니다. 또는 동적 크기의 2D 배열 유형을 구현할 수 있습니다. – juanchopanza

답변

2

는 사용하십시오 std::vector<std::vector<long>> :

private: 
    long x; 
    long y; 
    std::vector<std::vector<long>> matrix; 
public: 
    MyClass(long x, long y) : x(x), y(y), matrix(x, std::vector<long>(y)) { } 
}; 
+0

@ 2501 크기는 컴파일 타임에 알 수 없으므로이 경우가 아닙니다. – 0x499602D2

+0

아이디어를 가져 주셔서 감사합니다. x (x)와 y (y)는 무엇을합니까? – Ipawnu43

+0

@ Ipawnu43'x (x)'는 데이터 멤버'x'를 매개 변수'x'로 초기화합니다 (다른 변수 이름을 사용하면 명확하게 나타납니다). [이것은 회원 이니셜 라이저 목록입니다.] (http://en.cppreference.com/w/cpp/language/initializer_list) – 0x499602D2

0

나는 당신의 값을 포함하는 크기 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]의 선형 세그먼트가 발생합니다.