2013-03-18 3 views
2

목록을 처음부터 끝까지 표시하고 싶습니다. 마찬가지로 :C++ - 목록을 처음부터 끝까지 트래버스하는 방법?

for (std::list<T>::const_iterator it = list.end(); it != list.begin(); --it) 

문제는 첫 번째 요소 (list.begin())에있을 때의 입력하지 않습니다. 어떻게해야합니까?

+2

'list.end()'가 목록에 없으므로 _it이 입력되지 않습니다. – deepmax

+0

중복 가능성 : [C/C++/C++에서 역방향 루프를 수행하는 가장 좋은 방법은 무엇입니까?] (http://stackoverflow.com/q/275994/1084416) –

답변

19

rbegin 및 rend를 사용하여 역방향 반복기를 가져옵니다.

for (std::list<...>::reverse_iterator it=list.rbegin(); it!=list.rend(); ++it) 
+2

보너스로 '자동'을 사용할 수 있습니다. – xtofl

5

사용 역 반복자 :

for (auto it = l.crbegin(); it != l.crend(); ++it) 

for (std::list<...>::const_reverse_iterator it = l.rbegin(); it != l.rend(); ++it) 

C++의 11 std::list<T> 예를 list의 이름을 지정하지 마십시오.

+1

역 반복자는'rbegin' (마지막 요소)으로 시작해야한다고 생각합니다.'for (auto it = list.rend(); it! = list.rbegn(); ++ it) {...} .. 그리고'rend' (첫 번째 요소)로 간다, 그렇지? 귀하의 대답은 거꾸로 있습니다. – abelenky

+1

@abelenky 예, 그것이 맞습니다. OP 코드에서 잘못 잘라내어 붙여 넣기가 실패했습니다. – juanchopanza

0

덧셈 : 왜냐하면 it = list.end();에서 "끝"(또는 오른쪽 또는 왼쪽 경계점을 가리키는 점)으로 이해되는 포인터 [메모리의 일부 블록]을 가져옵니다. 그래서 그 내용을 출력합니다 (cout < < *) 당신은 메모리 [블록] 주소를 보게 될 것입니다. 당신이 선언이로 사용하는 경우 :

std::list<...>::const_iterator it = list.begin(); 
    std::list<...>::const_iterator iTail = list.end(); 
    while(it!=iTail) 
    { 
     //do smthing 
     ++it; 
    } 

중 루프가 생략됩니다 또는 당신은 힙에서 일부 쓰레기를 얻을 것이다. const_iterator의 경우 (문서를 읽지는 않았지만 분명히 "쓰기"보호). 반복자의 경우 std::list<...>::iterator.end() 을 가리키며 마지막 요소는 => [end]입니다. 경우 :

표준 : : 목록 < ...> :: const_reverse_iterator 및 표준 : : 목록 < ...> :: reverse_iterator

반복자에 따라, 첫 번째 ELEM에 자동으로 이동 start => end 또는 end =>start을 실행하면 목록을 통해 실행됩니다.

관련 문제