런 타임에 결정된 크기와 함께 C ++로 2D 배열을 나타내는 가장 좋은 방법
-
05-07-2019 - |
문제
C ++에서는 다음과 같은 일을하고 싶습니다.
int n = get_int_from_user();
char* matrix = new char[n][n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
delete [][] matrix;
그러나 물론 이것은 작동하지 않습니다. 비슷한 일을하는 가장 좋은 방법은 무엇입니까? 나는 이것에 대한 몇 가지 해결책을 보았지만 그들은 꽤 지저분 해 보인다.
해결책
수동 동적 방식 :
너비 배열*높이를 원한다고 가정 해 봅시다. 가장 효율적인 방법은 단일 차원 배열을 사용하는 것입니다.
char *matrix = new char[width*height];
삭제하려면 :
delete[] matrix;
액세스하려면 :
char getArrayValue(char *matrix, int row, int col)
{
return matrix[row + col*width];
}
수정하려면 :
void setArrayValue(char *matrix, int row, int col, char val)
{
matrix[row + col*width] = val;
}
매트릭스 부스트 :
부스트 :: 매트릭스 사용을 고려하십시오 의존성을 가질 수있는 경우.
그런 다음에 묶을 수 있습니다 선형 대수를 향상시킵니다 도서관.
여기에 있습니다 부스트의 샘플 코드 :: 매트릭스:
#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
matrix<char> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
for (unsigned j = 0; j < m.size2 (); ++ j)
m (i, j) = 3 * i + j;
일부 컴파일러의 스택에서 :
일부 컴파일러를 사용하면 실제로 런타임 결정 크기로 스택에서 배열을 만들 수 있습니다. G ++는 이러한 컴파일러의 예입니다. 그래도 기본적으로 VC ++ 로이 작업을 수행 할 수 없습니다.
따라서 G ++에서 이것은 유효한 코드입니다.
int width = 10;
int height = 10;
int matrix[width][height];
Drew Hall 은이 C99 기능을 VLA (Varible Length Array)라고하며 현대적인 컴파일러에서 켜질 수 있다고 언급했습니다.
다른 팁
나는 보통 다음과 같은 일을합니다.
char *matrix = new char [width * height];
matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';
delete [] matrix;
는 어때 std::vector< std::vector<int> > array2d;
?
C ++의 요점 (클래스와 함께) :-). 이것은 수업이 그것을 구현하기 위해 울고있는 일종의 사용입니다.
너 ~할 수 있었다 STL 또는 기타 제 3 자 클래스 라이브러리를 사용하여 원하는 데이터 구조를 가지고있을 것이라고 확신하지만 직접 굴려야하는 경우 다음 속성이있는 클래스를 만듭니다.
- N이 주어진 N*N 배열의 char (예 : Charray)를 생성하는 생성자 ..
- xy를 기준으로 값을 얻고 설정하는 멤버 함수는 단순히 charray [x*n+y]를 참조합니다.
- 배열을 삭제하는 소멸자.
진정한 2 차원 배열의 경우 :
int n = get_int_from_user();
char** matrix = new char*[n];
for (int i = 0; i < n; i++) {
matrix[i] = new char[n];
}
// Operations on matrix.
for (int i = 0; i < n; i++) {
delete [] matrix[i];
}
delete matrix;
내 머리 꼭대기에서. 실수, 의심의 여지가 없습니다. 그러나 다른 사람들이 더 우아한 접근 방식을 게시했다고 생각합니다.
손으로 그것을하는 것은 엉망이 될 것입니다.
나는 당신이 너비를 따로 추적 할 필요가 없도록 데이터 멤버를 클래스로 랩핑하는 확장 기능을 갖춘 1D 배열 접근법 (Brian R. Bondy의 선택한 답변)을 좋아합니다.
class Matrix
{
int width;
int height;
char* data;
public:
Matrix();
Matrix(int width, int height);
~Matrix();
char getArrayValue(int row, int col);
void setArrayValue(int row, int col, char val);
}
구현은 독자를위한 운동입니다. ;)
나는 이것이 좋은 것이라고 생각한다.
int n = get_int_from_user();
char **matrix=new (char*)[n];
for(int i=0;i<n;i++)
matrix[i]=new char[n];
matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';
for(int i=0;i<n;i++)
delete []matrix;
delete []matrix;
std::vector<int> m;
그런 다음 런타임에 M.Resize ()를 호출하십시오.
int* matrix = new int[w*h];
가우시안 제거와 같은 일을하고 싶다면 매트릭스가
int** matrix = new int*[h];
for(size_t i(0); i < h; ++i)
matrix[i] = new int[w];
(가우스 제거에서 우리는 일반적으로 한 행을 다른 행과 교환해야하므로 선형 시간에 복사하여 교환하는 대신 포인터를 일정한 시간에 줄로 바꾸는 것이 좋습니다).