2013-06-04 3 views
2

동적 인 2 차원 정수 배열을 필드로 사용하여 클래스를 작성합니다. 가장 중요한 부분은 짧은 액세스 시간입니다. 나는 크기와 그것의 내용이 아직 CPP 파일에 구현 생성자에서 정의 할 수있다 그러나 (propably INI 파일에서 읽기),헤더에 크기가없는 동적 배열 선언 .cpp로 정의.

//Grid.h 
class Grid{ 
    int ** array; 
} 

헤더 파일에 선언하고자합니다.

는 잘 모르겠어요 헤더에 int **array 포인터를 선언하고 액세스 할 수 및 기타 기능에는 문제가 발생할 것 배열을 만드는됩니다

array = new int*[x]; 
for(i=0;i<x;i++){  
array[i] = new int [y];  
} 

의 사용과 그것을 나중에 동적 배열을 할당하는 경우 array[i][j]의 정의를 (또는 다른 덜 명백한 오류) 필드로 직접 호출하지만, 언급 된 함수가 호출을 시작하기 전에 이미 정의되고 정의되어야합니다.

제 질문 -이 방법은 유효하고 효율적인 방법입니다. 나는 다른 아이디어를 받아 들일 것이다.
예, "벡터"클래스에 대해 들어 봤지만 효율이나 읽기 - 쓰기 및 정수 배열 성능에 대해 잘 모르겠습니다. 벡터의 크기는 유연하지만 필요하지는 않습니다. 배열은 한 번 설정하면 크기가 고정됩니다.

나는 자바 스타일의 코드 int[][] array에 익숙하다.

답변

3

네 방법은 유효하고 효율적입니다. 당신이 가지고있는 문제는 (분명히) 당신이 한계를 초과하지 않는 것을 확인하는 것입니다 (Java는 당신을 위해 C를 사용하여 당신이 [0 ... x-1] 사이에 있는지 확인해야만합니다.)

그러나 고효율이라고 말하면 1 차원 배열을 만들고이를 활용하는 것이 더 효율적인 방법입니다.이 방법은 메모리 사용 (특히 작은 크기의 경우) 및 액세스 시간면에서보다 효율적입니다 당신은 아마도 Grid 클래스 (Grid :: Set (value, x, y), Grid :: Get (x, y))에 액세스 함수를 래핑 할 수 있고 크기 오버런 여부를 직접 체크 할 수 있습니다.

//Grid.h 
class Grid{ 
    int maxx, maxy; 
    int *array; 

    public: 
    Grid(int x, int y); 
    ~Grid(); 
    int Get(int x, int y); 
} 


// making the grid 
Grid::Grid(int x, int y) 
{ 
    this->maxx= x; 
    this->maxy= y; 
    this->array= new int[this->maxx*this->maxy]; 
} 

// destroying the grid 
Grid::~Grid() 
{ 
    this->maxx= this->maxy= 0; 
    delete []this->array; 
    this->array= NULL; 
} 

// accessing the grid 
int Grid::Get(int x, int y) 
{ 
#if DEBUG 
    assert(x>=0 && x<this->maxx); 
    assert(y>=0 && y<this->maxy); 
#endif 
    return this->array[ y*this->maxx + x]; 
} 
.... 
+0

+1 객체가 접근과 저장을 책임지게하기 위해서 ... 배열을 비공개로 만들고 Get/Set 접근 메쏘드를 만든다. ods. 그렇게하면 저장소 구현을 변경하고 나머지 코드는 변경하지 않을 수 있습니다. 접근 방법의 효율성에 대해 걱정하지 마라. 컴파일러/링커에 의해 코드에 인라인 될 것이고, 범위 검사가 너무 비싸면 다른 코드를 변경하지 않고도 그것을 제거 할 수있다. ... – mark

+0

3의 규칙을 잊지 마세요! – aschepler

+0

위대한 설명, 고마워. Anbyody는 1 차원 배열과 2 차원 배열 사이의 성능/액세스 시간의 차이를 설명합니다. – Ponyman