2010-11-24 3 views
5

이 코드는 100 개의 요소 배열을 만들고 각 값을 false로 설정합니다.동적 배열의 기본값 설정

bool boolArray[100] = false; 

어떻게 동적 배열의 기본값을 설정할 수 있습니까?

void Foo(int size) 
{ 
    bool boolArray = new bool[size]; 
    //Now what? 
} 
+1

그것은'부울 * boolArray'가 아니라'부울 boolArray' (즉, 단지 하나 될 것 부울, 그래서'새로운 무언가 '의 임무는 심지어 말이되지 않을 것입니다). – ThiefMaster

+0

첫 번째 줄은'... = {false} '이어야합니다.' –

답변

11

여부

bool foo(int size) 
{ 
    bool* boolArray = new bool[size]();  // Zero-initialized 

    // Check that it is indeed zero-initialized: 
    for(int i = 0; i < size; ++i) 
    { 
     if(boolArray[i]) { delete[] boolArray; return false; } 
    } 
    delete[] boolArray; return true; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    cout << (foo(42)? "OK" : "Ungood compiler") << endl; 
} 

당신의 컴파일러는 옳은 일을 받아들이거나 할지라도 또 다른 문제입니다.

실제로 라면 원시 배열을 사용하는 것이 불가능한 경우 std::fill 또는 일부 또는 심지어 원시 루프를 사용하는 것이 좋습니다.

그러나 반복되는 delete[]- 표현식에 유의하십시오. 이러한 중복 코드는 잘못 이해하기 쉽습니다. Evil ™입니다. 그리고 원시 배열을 사용하면 잘못 될 수있는 많은 것들이 있습니다. 초보자 인 경우 원시 배열과 원시 포인터 등에 대해서는 No ™이라고 말하십시오.

대신 –에 대한 할당, 초기화, 복사 및 할당을 올바르게 관리하는 표준 라이브러리 컨테이너를 사용하십시오. 그러나 약간의 문제가 있습니다. 즉, 조기 최적화가 std::vector<bool>인데, 그렇지 않으면 자연 선택입니다. 본질적으로 std::vector<bool>은 값 하나당 1 비트를 사용하므로 bool 요소에 대한 참조를 넘겨 줄 수는 없지만 대신 프록시 객체 & hellip;

따라서 bool 요소의 경우, 예를 들어. std::bitset (컴파일 타임에 그 크기를 알 수있을 때), 또는 예를 들면. std::deque는,로는 다음과 같습니다.

#include <deque> 

bool foo(int size) 
{ 
    std::deque<bool> boolArray(size);  // Zero-initialized 

    for(int i = 0; i < size; ++i) 
    { 
     if(boolArray[i]) { return false; } 
    } 
    return true; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    cout << (foo(42)? "OK" : "Ungood compiler") << endl; 
} 

건배 & HTH,

2
bool* boolArray = new bool[size]; 
for(int i = 0; i < size; i++) { 
    boolArray[i] = false; 
} 
+0

+1 : Mehrdad의 std :: fill suggestions (+ 1-ed)와 같이 "우아함"이 아니지만 근본적이며 재사용 가능한 것은 훌륭합니다. , 확실하지 않은 경우 도달 할 수있는 생산적인 접근 방식. –

11

사용 std::fill function 또는 std::fill_n function.

std::fill_n(boolArray, length, defaultValue); 
std::fill(boolArray, boolArray + length, defaultValue); 

사이드 참고 : 대신 std::vector를 사용해보십시오. 또한 결과를 확인하고 배열 할당을 취소

bool* boolArray = new bool[size]();  // Zero-initialized 

전체 프로그램 : 당신이 그 배열을 포함하여 아무것도 그냥 기본값으로 초기화 할 수 있습니다 ++ 표준 C에서

+0

'std :: vector'를 사용하면 문제가 있습니다. 내 대답을 보라. 또한,'std :: fill'을 사용하는 것은 확실히 OP 문제의 일반화에 대한 좋은 해결책이지만, 당면의 특정 문제에는 반드시 필요한 것은 아닙니다. 다시, 내 대답을 참조하십시오. 건배 & hth., –

0

무엇에 대해 :

void Foo(int size) 
{ 
    // bool boolArray = new bool[size]; 
    // Did you mean bool*? 
    // Try and avoid direct allocation of memory. 
    // Memory allocation should be done inside an object that 
    // actively manages it. 

    // Normally I would recommend a vector 
    std::vector<bool> boolArray(size, false); 

    // But. And a Big but. Is that the standards committee decided to 
    // specialize the vector for bool so that each element only takes 
    // a single bit. Unfortunately this had some side effects that were 
    // made its use not perfect (time/assign-ability). 

    // So we can try a boost array 
    boost::array<bool, size> boolArray; 
} 
+0

음, 그냥 니트로, 당신은 런타임에'size'를 템플릿 인자로 사용할 수 없다. (필자가 쓰는 것처럼 코드 에서처럼). 아마도 부스트는 런타임 크기를 허용하는 배열을 가지고 있습니까? 내 대답에'std :: queue'에 착륙했지만 모두 다른 환경 설정을 가지고 있습니다 ... 건배, –

+0

어, 오타, 나는 대답에서 볼 수 있듯이 내 대답에'std :: deque'에 착륙했음을 의미했습니다. ... 어쨌든, 여러분의 코드는'boost :: array '에 있는데,'size'는 런타임 값이고, 컴파일되지 않습니다. 건배 & hth., –