2017-01-12 10 views
0

std::forward_list을 걷는 것이 가능하며,이 중재자가 null이 될 때까지 반복기를 증가시킵니다. 구식 방식 ...`std :: forward_list`는 iterator가 null이 될 때까지 계속 걸을 것인가?

다음 예제에서는 print() 함수를 만듭니다.

#include <iostream> 
#include <forward_list> 

void print(std::forward_list<int>::iterator fl_it, std::forward_list<int>::iterator e) { 

    while (fl_it != e) { 
     std::cout << *fl_it << ' '; 
     ++fl_it; 
    } 

    std::cout << std::endl; //-> 1 2 3 
} 

int main() { 
    std::forward_list<int> fl = {1, 2, 3}; 
    print(fl.begin(), fl.end()); 
    std::cout << std::endl; 
    return 0; 
} 

걷는 것을 언제 중지해야하는지 알 수 있도록 목록의 끝을 가리키는 반복자를 전달하는 것이 필요합니다.

void print(std::forward_list<int>::iterator fl_it) { 
    while (fl_it != nullptr) { 
     std::cout << *fl_it << ' '; 
     ++fl_it; 
    } 
    std::cout << std::endl; 
} 

내 컴파일러는이 fl_it != nullptr 사업을 좋아하지 않는다 :

내가 뭘 원하는 목록의 머리에 반복자를 통과, 거기에 더 이상 요소가 없을과 같이 될 때까지 함께 단계 단순히 .

첫 번째 경향은 iterator가 null인지 확인하는 방법을 찾고 목록의 끝을 참조하는 것이 었습니다. 슬프게도, 그런 방법은 존재하지 않습니다.

아이디어가 있으십니까?

+2

이런 식으로 생각하십시오 : 배열의 첫 번째 요소가 있고 다른 정보가 없다면 끝까지 도달 할 수 있습니까? – AndyG

+2

그리고 그 사람이 왔을 때 그 끝을 확인할 수 있습니까? – jaggedSpire

+0

* is *에는 *이 함수가있는 몇 가지 종류의 반복자가 있습니다 - isstream &'생성자와 기본 생성자가있는 'std :: istream_iterator '가 있습니다. 기본 생성 iterator는 범위에 대한 end 반복자의 역할을하며, istream 생성 iterator는 wrapped istream의 끝을 만나면 기본 생성 iterator와 동일한 값을 비교합니다. 그래서 당신은 함수에'istream_iterator'를 전달할 수 있고, 단순히 내부에 iterator를 생성 할 수 있습니다. 그러나 이것은 많은 유형의 반복자에 적용되지 않습니다. – jaggedSpire

답변

2

그렇지 않습니다.

std::forward_list은 표준 라이브러리 컨테이너입니다. 모든 컨테이너와 마찬가지로 begin에서 end으로 이동합니다. "null"이터레이터는 없습니다. 따라서 작업은 반복자의 범위에 있습니다.

Range TS 제안은 최종 반복기를 요구하는 대신 "센티넬"유형을 허용한다는 점에 유의하십시오. 단일 센티널은 모든 범위의 끝 반복자와 동일하게 비교할 수 있습니다. 따라서 forward_list은 실제로 이러한 값을 갖도록 업데이트 될 수 있습니다.

그러나 여전히 "null"반복기가 아닙니다.

0

iterator 객체가 정확하게 포인터가 아니라는 것을 알아야합니다. 이는 객체이며 데이터 구조에서 항목의 위치를 ​​나타냅니다. 또한 end 반복자를 증가시키지 않으면 null 반복자가되지 않습니다. 정의되지 않은 동작입니다. 목록의 마지막에, 대신 목록의 끝 반복자fl.end() 같은 경우 Can an STL map iterator go out of bounds through incrementing?

0

반복자를 봐 널 (null)이 아닙니다. 따라서 두 반복기 모두 함수에 전달해야합니다.

반복자의 내부 구현은 사용 된 STL 라이브러리에 따라 달라지며 std::forward_list 인터페이스는 ForwardIterator 개념 : http://en.cppreference.com/w/cpp/concept/ForwardIterator을 충족합니다.

+0

"두 개의 반복기를 함수에 전달해야합니다."<- 앞으로 연결되는 목록이 관련된 곳에는 반 주제가있는 것 같습니다. 한 방향 연결 목록에 마커가 있어야합니까? 우리가 선의 끝을 칠 때까지 우리는 행진 할 수 있어야합니다. – kmiklas

+0

내부적으로'fl.end()'는 센티넬 값을 나타낼 것이고, 그것을 최종 반복자와 비교하는 것은 실제로 포인터가 null인지 (실제로'std :: forward_list'가 구현되는 방법에 따라) 검사합니다. 그러나 모든 컨테이너 유형에 대한 STL에서 두 개의 반복자가 항상 목록을 반복하는 데 사용됩니다. – tmlen