이 코드는 100 개의 요소 배열을 만들고 각 값을 false로 설정합니다.동적 배열의 기본값 설정
bool boolArray[100] = false;
어떻게 동적 배열의 기본값을 설정할 수 있습니까?
void Foo(int size)
{
bool boolArray = new bool[size];
//Now what?
}
이 코드는 100 개의 요소 배열을 만들고 각 값을 false로 설정합니다.동적 배열의 기본값 설정
bool boolArray[100] = false;
어떻게 동적 배열의 기본값을 설정할 수 있습니까?
void Foo(int size)
{
bool boolArray = new bool[size];
//Now what?
}
여부
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,
bool* boolArray = new bool[size];
for(int i = 0; i < size; i++) {
boolArray[i] = false;
}
+1 : Mehrdad의 std :: fill suggestions (+ 1-ed)와 같이 "우아함"이 아니지만 근본적이며 재사용 가능한 것은 훌륭합니다. , 확실하지 않은 경우 도달 할 수있는 생산적인 접근 방식. –
사용 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에서
'std :: vector'를 사용하면 문제가 있습니다. 내 대답을 보라. 또한,'std :: fill'을 사용하는 것은 확실히 OP 문제의 일반화에 대한 좋은 해결책이지만, 당면의 특정 문제에는 반드시 필요한 것은 아닙니다. 다시, 내 대답을 참조하십시오. 건배 & hth., –
무엇에 대해 :
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;
}
음, 그냥 니트로, 당신은 런타임에'size'를 템플릿 인자로 사용할 수 없다. (필자가 쓰는 것처럼 코드 에서처럼). 아마도 부스트는 런타임 크기를 허용하는 배열을 가지고 있습니까? 내 대답에'std :: queue'에 착륙했지만 모두 다른 환경 설정을 가지고 있습니다 ... 건배, –
어, 오타, 나는 대답에서 볼 수 있듯이 내 대답에'std :: deque'에 착륙했음을 의미했습니다. ... 어쨌든, 여러분의 코드는'boost :: array
그것은'부울 * boolArray'가 아니라'부울 boolArray' (즉, 단지 하나 될 것 부울, 그래서'새로운 무언가 '의 임무는 심지어 말이되지 않을 것입니다). – ThiefMaster
첫 번째 줄은'... = {false} '이어야합니다.' –