2013-08-24 4 views
0

어레이 선언의 2 종류 고려 : I 알고 여기서 다음 X하여 인덱스2 차원 배열을 시뮬레이션하는 1 차원 배열과 연속적으로 비슷한 메모리에 2 차원 배열이 설정되어 있습니까?

T x [rows * cols]; // type 1 
T y [rows][cols]; // type 2 

가 평소 제 1 타입을 사용 (유형 1) 행 * COLS + COL] I 원하는 경우

2d 배열을 1 차원 배열로 복사하는 것. 즉 : copy type2 -> type1. 이것들이 같은 방식으로 메모리에 배치되도록 보장된다면, 나는 다른 것과 하나의 memcpy를 할 수 있을까요? 현재 나는 루프가 있지만 메모리가 둘 다 동일한 레이아웃이라면 나는 단지 memcpy를 할 수 있다고 생각하고있다. 아래의 다음 public 생성자를 고려하십시오.

public: 
    // construct a matrix from a 2d array 
    template <unsigned int N, unsigned int M> 
    Matrix (T (&twoDArray)[N][M] ) : rows_(N), cols_(M), matrixData_(new T[rows_*cols_]) 
    { 
    // is there a refactor here? Maybe to memcpy? 
    for (unsigned int i = 0; i < rows_ ; ++i) 
    { 
     for (unsigned int j = 0; j < cols_ ; ++j) 
     { 
     matrixData_[ i * cols_ + j ] = twoDArray[i][j]; 
     } 
    } 
    } 

    private: 
    unsigned int rows_; 
    unsigned int cols_; 
    T* matrixData_; 
+2

"type 2"는 적법하지 않습니다. C++. –

+1

원하는 항목 : 'T ** y = new T * [row]; // type 2' – smac89

+3

@ Smac89 : 아무도 원하지 않습니다. –

답변

2

2 차원 배열 (선언 한 종류)이 메모리에서 인접하도록 보장됩니다. 그렇다고 memcpy를 사용해야한다는 의미는 아닙니다. memcpy가 T에 대해 올바르게 작동하지 않을 수 있으므로 특히 템플릿과는 다릅니다. 당신은 가지고있는 것을 지킬 수 있습니다. 여기에 (당신은 그럼 그냥 루프에 대한 일반 계수를 사용하여 C++ (11)를 사용할 수없는 경우) 그래도 난을 작성할 수 있습니다 방법입니다

template <unsigned int N, unsigned int M> 
Matrix (T (&twoDArray)[N][M] ) : rows_(N), cols_(M), matrixData_(new T[rows_*cols_]) 
{ 
    T * out = matrixData_; 
    for (auto const & sub : twoDArray) 
     out = std::copy(std::begin(sub), std::end(sub), out); 
} 

또는 더 나은 아직, 단지 std::vector를 사용합니다. 그런 다음 복사 생성자, 할당 연산자 또는 소멸자를 구현할 필요가 없습니다. (당신은 그 세 가지를 모두 구현했습니다, 맞습니까?)

+0

예, C++ 11을 사용하고 있기 때문에 모두 5가 있습니다. 나는 연속적인 메모리를 유지하려고 노력하고 있었고 벡터를 사용하지 않고이 작업을 수행 할 수 있는지 알아보기 위해 노력했다. 그러나 C++에서는 하나 이상의 인수로 연산자 []를 오버로드 할 수 없다. m [1,1] = 5와 같이하십시오. '// 불변입니다. const T * 연산자 [] (부호없는 int 행, 부호없는 int col) const { return matrixData_ [행 * cols_ + col]; } // 변경 가능 T * 연산자 [] (부호없는 int 행, 부호없는 int col) { return matrixData_ [행 * cols_ + col]; } ' – bjackfly

+0

그 의견이 있으십니까? 꽤 멋진 컬렉션 루프를 넣어, 나는 그것을 좋아하지. – bjackfly

+0

@bjackfly : 나는 당신의 행렬 클래스 대신에'vector'를 사용하지 않았다. 나는 수동으로 메모리를 관리하는 대신 클래스 내부에서'vector' *를 사용하려고했다. –

3

하지만 일반적으로 컴파일러는 Tx [행] [열]이 Tx [행 * 열]처럼 동작하는 간단한 Tx를 만듭니다. 동적으로 메모리를 선언하지 않는 한

T** x = new T*[rows]; 
for (int i = 0; i < rows; ++i) 
    x[i] = new T[columns]; 

이 예에서는 서로 다릅니다.

관련 문제