문제

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;

내 머리 꼭대기에서. 실수, 의심의 여지가 없습니다. 그러나 다른 사람들이 더 우아한 접근 방식을 게시했다고 생각합니다.

부스트 :: multi_array

손으로 그것을하는 것은 엉망이 될 것입니다.

나는 당신이 너비를 따로 추적 할 필요가 없도록 데이터 멤버를 클래스로 랩핑하는 확장 기능을 갖춘 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];

(가우스 제거에서 우리는 일반적으로 한 행을 다른 행과 교환해야하므로 선형 시간에 복사하여 교환하는 대신 포인터를 일정한 시간에 줄로 바꾸는 것이 좋습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top