태그 보관물: variable-assignment

variable-assignment

C ++에서 배열의 모든 요소를 ​​하나의 기본값으로 초기화 하시겠습니까? 배열 초기화 에 대한 유용한 목록이

C ++ 참고 사항 : 배열 초기화 에는 배열 초기화 에 대한 유용한 목록이 있습니다. 나는

int array[100] = {-1};

-1로 가득 찼을 것으로 예상하지만 첫 번째 값만 있고 나머지는 0과 임의의 값이 혼합되어 있습니다.

코드

int array[100] = {0};

잘 작동하고 각 요소를 0으로 설정합니다.

내가 여기서 잃어버린 것 .. 값이 0이 아닌 경우 초기화 할 수 없습니까?

그리고 2 : 기본 초기화 (위와 같이)는 전체 배열을 통한 일반적인 루프보다 빠르며 값을 할당합니까, 아니면 같은 일을합니까?



답변

사용한 구문을 사용하여

int array[100] = {-1};

모든 생략 된 요소가로 설정되었으므로 ” 첫 번째 요소를 설정하고 -1나머지를 설정 0“이라고합니다 0.

C ++에서 그것들을 모두로 설정 -1하려면 std::fill_n(에서 <algorithm>) 와 같은 것을 사용할 수 있습니다 .

std::fill_n(array, 100, -1);

휴대용 C에서는 자체 루프를 굴려야합니다. 컴파일러 확장이 있거나 구현 정의 동작에 적합한 경우 바로 가기로 의존 할 수 있습니다.


답변

구문을 허용하는 gcc 컴파일러의 확장이 있습니다.

int array[100] = { [0 ... 99] = -1 };

모든 요소를 ​​-1로 설정합니다.

이것을 “지정된 이니셜 라이저”라고 합니다. 자세한 내용 은 여기 를 참조 하십시오 .

이것은 gcc c ++ 컴파일러를 위해 구현되지 않았습니다.


답변

링크 한 페이지는 이미 첫 번째 부분에 대한 답변을 제공했습니다.

명시 적 배열 크기를 지정했지만 더 짧은 초기화 목록을 지정하면 지정되지 않은 요소는 0으로 설정됩니다.

전체 배열을 0이 아닌 값으로 초기화하는 기본 제공 방법은 없습니다.

어느 쪽이 더 빠른가에 대한 일반적인 규칙이 적용됩니다 : “컴파일러에게 최대한의 자유를주는 방법이 더 빠를 것입니다.”

int array[100] = {0};

컴파일러에게 “100 개의 정수를 0으로 설정”이라고 말하면 컴파일러는 자유롭게 최적화 할 수 있습니다.

for (int i = 0; i < 100; ++i){
  array[i] = 0;
}

훨씬 더 구체적입니다. 컴파일러에게 반복 변수를 작성하도록 i지시 하고 요소를 초기화 해야하는 순서 등을 알려줍니다 . 물론 컴파일러는이를 최적화 할 가능성이 있지만 여기서 중요한 것은 문제를 과도하게 지정하여 컴파일러가 동일한 결과를 얻기 위해 더 열심히 노력하도록하는 것입니다.

마지막으로, 배열을 0이 아닌 값으로 설정하려면 (C ++에서는) 다음을 사용해야합니다 std::fill.

std::fill(array, array+100, 42); // sets every value in the array to 42

다시 말하지만, 배열을 사용하여 동일한 작업을 수행 할 수 있지만 더 간결하며 컴파일러에 더 많은 자유를줍니다. 당신은 단지 전체 배열이 42 값으로 채워지기를 원한다고 말하고 있습니다. 어떤 순서로 수행되어야하는지, 다른 어떤 것도 말하지 않습니다.


답변

C ++ 11에는 또 다른 (불완전한) 옵션이 있습니다.

std::array<int, 100> a;
a.fill(-1);


답변

{}을 사용하면 선언 된대로 요소를 할당합니다. 나머지는 0으로 초기화됩니다.

= {}초기화 하지 않으면 내용이 정의되지 않습니다.


답변

연결 한 페이지

명시 적 배열 크기를 지정했지만 더 짧은 초기화 목록을 지정하면 지정되지 않은 요소는 0으로 설정됩니다.

속도 문제 :이 작은 배열에는 차이가 거의 없습니다. 큰 배열로 작업하고 크기보다 속도가 훨씬 더 중요한 경우 기본값의 const 배열 (컴파일 타임에 초기화 됨) memcpy을 수정 가능한 배열로 가질 수 있습니다 .


답변

배열을 공통 값으로 초기화하는 또 다른 방법은 실제로 일련의 정의로 요소 목록을 생성하는 것입니다.

#define DUP1( X ) ( X )
#define DUP2( X ) DUP1( X ), ( X )
#define DUP3( X ) DUP2( X ), ( X )
#define DUP4( X ) DUP3( X ), ( X )
#define DUP5( X ) DUP4( X ), ( X )
.
.
#define DUP100( X ) DUP99( X ), ( X )

#define DUPx( X, N ) DUP##N( X )
#define DUP( X, N ) DUPx( X, N )

배열을 공통 값으로 초기화하는 것은 쉽게 수행 할 수 있습니다.

#define LIST_MAX 6
static unsigned char List[ LIST_MAX ]= { DUP( 123, LIST_MAX ) };

참고 : DUPx는 DUP에 대한 매개 변수에서 매크로 대체를 가능하게하기 위해 도입되었습니다.