2014-12-22 2 views
4

초심자로 C++을 공부하고 있으며 (2 개월 전 시작) 단순한 코드에 문제가 있습니다. 나는 0이 벡터에있는 각 요소의 값을 설정하기 위해 시도했지만 작동하지 않는 이유를 이해할 수 없다 :내 range-for 루프에 로직 오류가 발생했습니다.

vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

for (int x : numbers) x = 0; 

내가 바보 같은 소리 수 있다는 것을 알고 있지만 나는 초보자입니다. 내가 전통적으로 반복되는 루프로 똑같은 일을하려한다면, 왜 작동 하는가?

위해
+0

그것은 오해를 보인다 사용하는 것이 더 좋을 것이다 모든 요소에 특정 값을 설정하는 경우 그 [에 종이 n3853] (HTTP의 제안 ://open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3853.htm) 수정을 시도합니다. 나는 당신이 그것을 재미있을 것이라고 생각한다. –

답변

3

각 반복에서 배열의 값이 x에 할당되고 배열의 값이 아닌 x를 변경하기 때문에 배열의 값은 변경되지 않습니다.

기본적 범위 기반 루프는 루프의 다음 통상 유사하다 :

for(int i = 0; i < numbers.length(); i++) 
{ 
    int x = numbers[i]; 

    //your code 
} 

.

자세한 내용은 http://en.cppreference.com/w/cpp/language/range-for을 참조하십시오. 이 상태 :

range_expression 는 반복 순서 또는 범위를 결정하기 위해 평가된다. 시퀀스의 각 요소는 다시 참조 해제되며 은 range_declaration에 제공된 유형 및 이름을 사용하여 변수에 할당됩니다.

또한 "Shmil The Cat"예제가 게시되었으며 범위 루프 작동 방식을 이해하는 데 유용한 예제가 추가로 있습니다.

3
for (int& x : numbers) x = 0; 

변이하여 용기 요소가 하나의 변수를 반복 범위 루프에 대한 참조를 사용한다

+4

설명 : 범위 기반 for 루프는 참조로 지정하지 않는 한 매개 변수를 값으로 사용합니다. –

1

그것을 (기본적으로 반복 변수는 현재의 반복 된 요소의 복사이다) 작동하지 않는 경우 foreach을 통해 배열의 요소에 대한 참조가 없습니다. 이것에 대해 생각해 보면 배열 numbers에있는 요소를 검색하고 참조가없는 x에 사본의 복사본을 만드는 중입니다. 따라서 x가 수행하는 모든 변경 사항은 숫자 배열에 반영되지 않습니다.

어떻게 작동합니까 @Shmil The Cat 제안. 또는 전통적인 방식으로도 당신이 말한 것처럼 일을 할 것입니다.

1

원거리 기반 루프는 컨테이너를 원래 컨테이너의 참조로 명시 적으로 전달할 때까지 원래의 복사본으로 간주하기 때문에 벡터 항목에는 값 (이 경우 0)이 할당되지 않습니다. , 숫자의 모든 요소에 대해

:

여기 당신은 아래를 참조 할 수있는 방법이며, @Shmil 고양이

0

에 의해 제안

for (int& x : numbers) x = 0; 

당신이 이해를 돕기 위해 사용하십니까 데이터를 x으로 복사하고 x을 0으로 설정하십시오.// 이제 벡터의 값을 건드리지 않습니다. 아래 루프 읽기

for (int x : numbers) 
    x = 0; 

: 번호의 요소마다
은 그것에 참조을하고, 반면에 0이 행 기준으로 값을 변경의 값을 변경 벡터.

for (int &x : numbers) 
    x = 0; 
0

당신이 원하는 모든는 std::fill

std::fill(numbers.begin(), numbers.end(), 0); 
관련 문제