2012-01-31 4 views
3

C++에서 클래스의 멤버 배열의 모든 값을 초기화하는 방법은 무엇입니까?C++ 클래스의 멤버 배열의 모든 값 초기화

#define MAX_MATRIX 20 
Class Matrix { 
public: 
     Matrix(); //constructor 
protected: 
     int n[MAX_MATRIX]; // note cannot do = { 0} or w/e here 
}; 

Matrix::Matrix() 
{ 
    // how to set all n to -1? 
} 

답변

0
for (unsigned i = 0; i < MAX_MATRIX; ++i) n[i] = -1; 
6

당신은 std::fill 사용할 수 있습니다

std::fill(begin(n), end(n), -1); 

(이 beginend 함수는 C++ 11 네임 스페이스 std에서 발견, 또는 할 수 있습니다 쉽게 implement them yourself C++ 03)

+0

;-) –

2

여기에는 유형이 있습니다.

0
#include <cstring> 

class Matrix { 
public: 
    Matrix() : n() { n.fill(-1); } 
protected: 
    std::array<int, 20> n; 
}; 
...

Matrix::Matrix() 
{ 
static bool init=false; 
static int n_init[MAX_MATRIX]; 
if (!init){ 
    for(int i=0; i<MAX_MATRIX; i++){ 
    n_init[i] = -1; 
    } 
    init = true; 
} 
memcpy(n,n_init,MAX_MATRIX*sizeof(int)); 
} 

배열 n_init가 정확히 한 번만 초기화 및 메모리에 저장 한 다음 이후의 모든 구조물이없는 루프가 빠른 메모리 복사됩니다. 인덱스를 반복 할 때와 마찬가지로 MAX_MATRIX의 크기를 늘리면 (특히 Matrix::Matrix()을 여러 번 호출하는 경우) 속도가 많이 저하되지 않아야합니다.

4

이것은 C++ 03의 놀라운 단점이었습니다. C++ 11에서는이 수정되었습니다, 당신은 이제 배열을 포함, 모든 것을 초기화 할 수 있습니다 :

class Matrix 
{ 
public: 
    Matrix() : n { } { } 
protected: 
    static const unsigned int MAX_MATRIX = 20; 
    int n[MAX_MATRIX]; 
}; 

(. 불쾌한 처리기 매크로도 C++로 필요하지 않습니다) C++ 03에서

, 당신은 단순히 수 없습니다 배열 구성원을 초기화 할 수 있지만 집합의 몸, 예를 들어 의미있는 설정 std::fill(n, n + MAX_MATRIX, 0);을 통해

는 (물론 std::array<int, MAX_MATRIX> n; 말을 많이 좋을 것입니다.)

문제도 C++ (11)에 존재하지 않는
관련 문제