2008-08-13 4 views
29

컨테이너 세트에 액세스하는 일반적인 방법을 찾으려고합니다. 다른 사용자 지정 목록 외에 표준 벡터와 목록이 있습니다.일반 이터레이터

사용자 지정 목록은 반복기를 정의합니다.

class Iterator: public std::iterator<std::forward_iterator_tag, T> { 
    // ... 
} 

Iterator begin() { 
    return (Iterator(root)); 
} 

Iterator end() { 
    return (Iterator(NULL)); 
} 

적절한 연산자가 오버로드됩니다.

이상적으로, 나는 이것을하고 싶다;

class Foo { 
public: 
    Foo() { 
     std::list<int> x; 
     std::vector<int> y; 
     custom_list<int> z; 

     iter = x.begin(); // OR 
     iter = y.begin(); // OR 
     iter = z.begin(); 

     // ... 
    }; 
private: 
    std::iterator<int> iter; 
}; 

분명히 이들은 서로 다른 유형의 모든 반복자입니다. 그러나 모든 컨테이너가 같은 유형이라고 가정 할 수 있습니다.

이 문제를 해결하는 우아한 방법이 있습니까?

답변

2

더 나은 늦게 관심을 찾을 수있는 몇 가지 기사 ...입니다 그리고 그 안에 무엇이 있었는지 추측하십시오 : 맞습니다. 반복자 그건 정확히 원하는 걸.

불행히도 잡지를 보려면 ACCU의 회원이되어야합니다 (이 기사는 David가 링크하는 2000 년의 Overload 기사를 참조합니다). 그러나 연중 무휴로 1 년 동안 훌륭한 잡지를 읽고 회의, 사용자 그룹을 읽으십시오. 회원이 되시면 PDF 파일을 볼 수 있습니다. what are you waiting for?

+2

이 기사가 6 월 8 일 vol 20 Issue 8에서 C++의 Custom Iterators라는 제목으로 언급 되었다면 도움이 될 것입니다. 멋진 사용자 사진 btw. – danio

1

물어볼 때주의해야 할 경우. 표시되는 any_iterator 클래스는 반복되지 않는 반복기 유형에서 작동합니다. 당신은 단지 3 개 밖에 가지고 있지 않습니다. 물론 네 번째 유형을 나중에 추가해야 할 수도 있습니다. 그러나 O (1) 코드를 추가로 사용한다면 어떻게 될까요?

가능한 포함 된 유형의 닫힌 집합의 가장 큰 장점은 sizeof()에 상한이 있다는 것입니다. 즉, heap과 간접 참조를 피할 수 있습니다. 기본적으로 boost :: variant에 모두 넣고 apply_visitor를 호출하십시오.