2014-04-01 4 views
2

데이터를 관리하는 클래스가 있습니다.비 Stl 컨테이너 용 자체 반복자 만들기

내부에있는 데이터의 일부만 반환하고 싶지만 여러 번 수행되는 프로세스이므로 컨테이너 안의 데이터를 복사하고 컨테이너를 반환하지 않으려합니다.

참조 나 비슷한 것을 보낼 수 있다면 좋을 것입니다. 반복자가 떠오른다. 하지만 사용하기 때문에 Eigen3 매트릭스 (어쨌든 반복자 (2D 매트릭스를하지 않는))

내가 반복자 행동, 그런 것을 모방 생각하고 (?) :

typedef unsigned int Index; 

class MatrixIterator 
{ 
public: 
    MatrixIterator(Eigen::MatrixXd *m, Index min, Index max): 
     _col(0), _index(0), _min(min), _max(max), _matrix(m) 
    {} 

    void operator++() 
    { 
     if (_index + _min + 1 != _max) 
      _index++; 
    } 
    void operator--() 
    { 
     if (_index != _min) 
      _index--; 
    } 

    double operator*() 
    { 
     return _matrix->operator() (_index + _min, _col); 
    } 

    void setCol(Index col) { _col = col; } 

    Index min() { return _min; } 
    Index max() { return _max; } 

private: 
    // the matrix is 2D we can select 
    // on which column we want to iterate 
    Index _col; 

    // current position 
    Index _index; 

    // select the range on which the user can iterate 
    Index _max; 
    Index _min; 

    // the matrix on which we want to iterate over 
    Eigen::MatrixXd* _matrix; 
} 
  • 이전에는 반복기를 사용한 적이 없었습니다. 맞습니까?
  • MatrixIteratorstd::iterator에서 상속 할 수 있습니까? 따라서 stl은 일반적인 반복자로 이해할 수 있습니까?
  • 비슷한 것을하는 더 좋은 방법을 알고 계십니까?

는 내가 읽고 :

편집 : 내가 원하는 행렬의 일부만 반복합니다 (즉, _min 및 _max가있는 이유입니다), 내가 조작하는 데이터 데이터는 이미 주문되어 있으므로 시계열입니다. 우리는 데이터 쿼리에 대한 응답으로 MatrixIterator를 고려할 수 있다고 생각합니다.

답변

2

이전에는 반복기를 사용한 적이 없었습니다. 맞습니까?

좋은 시작입니다. 아이디어는 맞지만 몇 가지를 놓치고 있습니다. 첫째, 충분한 운영자가 없습니다. reference을 확인하고 현명하게 제공 할 수있는 모든 운영자를 제공해야합니다 (이 경우 구현하기가 더 어려울 수 있기 때문에 랜덤 액세스 운영자 만 유용 할 수도 있고 유용하지 않을 수도 있습니다). 둘째, 반복자 클래스에 iterator traits을 제공해야합니다. 이것은 보통 반복자 클래스에 필요한 중첩 된 typedef를 작성하여 수행됩니다 (클래스에 대해 std::iterator_traits 템플릿을 전문화 할 수도 있지만 중첩 된 typedef를 실제로 추가 할 수없는 경우에만 사용합니다).

내 MatrixIterator를 std::iterator에서 상속 할 수 있으므로 stl이 일반적인 반복기로 이해할 수 있습니까?

아니요, 일반적으로 std::iterator 클래스를 상속 받아서는 안됩니다. STL은 템플릿 라이브러리 (일반 프로그래밍 (GP))이므로 OOP에서와 같이 기본 클래스 상속 모델을 사용하지 않습니다.STL 알고리즘은 반복자를 템플릿 인수로 사용하고 알고리즘에서 필요에 따라 반복적으로 사용합니다 (또는 반복자 유형과 연결된 iterator_category 특성으로 가능하면). 이것은 generic programming이지 객체 지향 프로그래밍이 아니라 사과와 오렌지입니다.

비슷한 것을하는 더 좋은 방법을 알고 계십니까?

음,이 작업을 수행하는 하나의 편리한 방법은 "빈칸을 채워"메커니즘 만드는 반복자 자동화의 종류를 제공 boost::iterator_facade 같은 클래스 템플릿을 (ref 참조)를 사용하는 것입니다. 그것은 잘 알려진 매우 유용한 Curiously Recurring Template Pattern (또는 간단히 CRTP)을 사용합니다. 이것은 반복자에 필요한 모든 연산자를 구현하는 것이 매우 상세하고 반복적 일 수 있기 때문에 유용합니다. 보통 소수의 핵심 연산에만 의존하기 때문에 (boost::iterator_facade과 같은 CRTP 클래스를 사용할 때 "채워 넣기 만하면됩니다").

+0

나는 boost :: iterator_facade를 시도 할 것이다. 부스트 :: iterator_facade에 대해 ~ – Setepenre

+0

+1을 주셔서 감사합니다. 전에 그걸 사용했는데 아주 잘 작동했습니다. 쓰기가 약간 지루하지만 읽고 읽고 사용하는 것이 좋습니다. –

+0

부스트 라이브러리에 묶지 않으려면'iterator_facace'와 비슷한 클래스를 쉽게 재현하고 영감을위한 소스 코드를 찾아 재현하면됩니다. –