2016-05-31 2 views
0

제네릭 2D 배열에 대한 고유 한 클래스를 만들고 싶습니다. 이것은 내가 지금까지 무엇을 가지고 :[] [] 연산자를 사용하여 제네릭 2D 배열 클래스의 값을 변경하십시오.

#pragma once 
#include <vector> 

using namespace std; 

template<class T> 
class My2DArray { 
private: 
    vector<vector<T>> array; 
    int width, height; 

public: 
    My2DArray() {} 
    My2DArray(int w, int h) : width(w), height(h) { 
     array.resize(w); 
     for (int i = 0; i < w; i++) { 
      array[i].resize(h); 
     } 
    } 

    ~My2DArray() {} 

    vector<T> operator[](int index) { 
     return array[index]; 
    } 

    T* at(int x, int y) { 
     return &array[x][y]; 
    } 

    int getWidth() { return width; } 
    int getHeight() { return height; } 
}; 

내가 다시 벡터 클래스의 기본 [] 운영자가 액세스 할 수있는 vector<T>를 반환 내 수업을 위해 내 자신의 [] 연산자를 가지고 있기 때문에, 그 희망 내 클래스는 법선 벡터처럼 작동하지만 그렇게 보이지는 않습니다. 내 자신의 클래스에 대한 [][] 운영자 작업을 만들 수있는 방법이 있나요

My2DArray<int> intArray1(5, 5); 
intArray1[0][0] = 2;    //does not work 
cout << intArray1[0][0] << "\n"; //prints 0 
/*-------------------------------------------*/ 
My2DArray<int> intArray2(5, 5); 
*intArray2.at(0,0) = 2;   //works 
cout << intArray2[0][0] << "\n"; //prints 2 
/*-------------------------------------------*/ 
vector<vector<int>> intArray3; 
intArray3.resize(5); 
for (int i = 0; i < 5; i++) { 
    intArray3[i].resize(5); 
} 
intArray3[0][0] = 2;    //works 
cout << intArray3[0][0] << "\n"; //prints 2 

또는 내가 나에게주는 내 .at(x,y) 기능을 사용해야합니까 : 다음은 내가 또는 2 차원 배열의 요소를 변경할 수 없습니다 수있는 방법 세 가지 방법을 보여줍니다 포인터를 사용하여 값을 수정 하시겠습니까?

+2

'const My2DArray'가'[]'을 사용할 수있게 해주는'operator []'의 두 번째 오버로드가 없습니다. 또한이 경우에는'width'와'height'와 같은 관계없는 변수를 사용하지 않아야합니다. 당신은'vector'를 사용하고,'vector'는'size()'메소드를 호출하여 크기를 알고 있습니다. 이러한 관계없는 변수를 사용하면 버그가 발생할 확률이 증가합니다 (너비 및 높이 변수를 업데이트하지 않음). 따라서 당신의 생성자는 단순히 다음과 같을 수 있습니다 :'My2DArray (int w, int h) : array (w, std :: vector (h)) {}' – PaulMcKenzie

답변

3

귀하의 operator[]은 매트릭스 컬럼의 새로운 복사본을 반환합니다. 이는 매우 비효율적이며 매트릭스 수정을 허용하지 않습니다. 당신이 진짜 행렬 요소에 액세스하려면, 참조하는 메소드의 리턴 타입을 변경

vector<T> &operator[](size_t index) { 
    return array[index]; 
} 

(size_t 당신은 아마 부정적인 지표를하지 않으에 대한 인덱스에 대한 유형으로 더 의미가 있습니다.)

BTW

는, 어레이 자체보다 적절한 크기로 초기화 될 것이다 :

My2DArray(size_t w, size_t h) : width(w), height(h), array(w, vector<T>(h)) {} 

보다는 제 기본적 구성하고 추가의 ctor 체 변화.

관련 문제