좋아요, 작업이 단일 메모리 블록을 유지하면서 주소 지정 방법을 [] [] 유지하는 경우 클래스를 사용하여 몇 가지 트릭을 시도해 보겠습니다. 이 시간 절약 아니지만, 매우 효율적인 메모리가,
class CoordProxy
{
private:
int coordX;
int arrayWidth;
int * dataArray;
public:
CoordProxy(int * newArray, int newArrayWidth, int newCoordX)
{
coordX = newCoordX;
arrayWidth = newArrayWidth;
dataArray = newArray;
}
int & operator [](int newCoordY)
{
return (dataArray[newCoordY * arrayWidth + coordX]);
}
};
class CoordsWrapper
{
private:
int * dataArray;
int width;
int height;
public:
CoordsWrapper(int * newArray, int newWidth, int newHeight)
{
dataArray = newArray;
width = newWidth;
height = newHeight;
}
CoordProxy operator[] (int coordX)
{
return CoordProxy(dataArray, width, coordX);
}
};
int main(int argc, char * argv[])
{
int * a = new int[4 * 4];
ZeroMemory(a, 4 * 4 * sizeof(int));
CoordsWrapper w(a, 4, 4);
w[0][0] = 10;
w[0][1] = 20;
w[3][3] = 30;
std::for_each(&a[0], &a[4 * 4], [](int x) { printf("%d ", x); });
delete[] a;
}
주 : 4 개의 int 원래 2 이상의 클래스 포인터를 사용하여 첫 번째 내부 프록시이다.
도 좋네요 훨씬 빨리 해결 방법이 있습니다,하지만 당신은 (,) 표기법에 찬성 표기 [] []에서 사임해야 할 것입니다 :
class CoordsWrapper2
{
private:
int * data;
int width;
int height;
public:
CoordsWrapper2(int * newData, int newWidth, int newHeight)
{
data = newData;
width = newWidth;
height = newHeight;
}
inline int & Data(int x, int y)
{
return data[y * width + x];
}
};
int main(int argc, char * argv[])
{
int * a = new int[4 * 4];
ZeroMemory(a, 4 * 4 * sizeof(int));
CoordsWrapper2 w(a, 4, 4);
w.Data(0, 0) = 10;
w.Data(0, 1) = 20;
w.Data(3, 3) = 30;
std::for_each(&a[0], &a[4 * 4], [](int x) { printf("%d ", x); });
delete[] a;
}
참고 인라인 지시어. 컴파일러는 메소드 호출을 실제 소스 코드로 대체 할 것을 제안합니다. 이 솔루션은 훨씬 더 효율적이며 고전적인 인덱싱만큼 효율적이지 않으며 시간이 절약됩니다.
1D 배열로 2D 연산을 나타내는'Matrix' 클래스를 만드는 것이 좋습니다. – chris
http://stackoverflow.com/questions/1719607/is-the-memory-allocated-by-new-operated-consecutive보세요. – Bill
@bill, 그건 내 질문에 대답하지 않았지만 링크를 주셔서 감사합니다. – Mechy