좋은 문제. 두 범위를 단일 범위로 바꾸는 특정 반복기 래퍼 유형을 구현하려고합니다. 의 라인에 뭔가 :
// compacted syntax for brevity...
template <typename T1, typename T2>
struct concat_iterator
{
public:
typedef std::forward_iterator_tag iterator_category;
typedef typename iterator_traits<T1>::value_type value_type;
typedef *value_type pointer;
typedef &value_type reference;
concat_iterator(T1 b1, T1 e1, T2 b2, T2 e2)
: seq1(b1), seq1end(e1), seq2(b2), seq2end(e2);
iterator& operator++() {
if (seq1 != seq1end) ++seq1;
else ++seq2;
return this;
}
reference operator*() {
if (seq1 != seq1end) return *seq1;
else return *seq2;
}
pointer operator->() {
if (seq1 != seq1end) return &(*seq1);
else return &(*seq2);
}
bool operator==(concat_iterator const & rhs) {
return seq1==rhs.seq1 && seq1end==rhs.seq2
&& seq2==rhs.seq2 && seq2end==rhs.seq2end;
}
bool operator!=(contact_iterator const & rhs) {
return !(*this == rhs);
}
private:
T1 seq1;
T1 seq1end;
T2 seq2;
T2 seq2end;
};
template <typename T1, typename T2>
concat_iterator<T1,T2> concat_begin(T1 b1, T1 e1, T2 b2, T2 e2)
{
return concat_iterator<T1,T2>(b1,e1,b2,e2);
}
template <typename T1, typename T2>
concat_iterator<T1,T2> concat_end(T1 b1, T1 e1, T2 b2, T2 e2)
{
return concat_iterator<T1,T2>(e1,e1,e2,e2);
}
는 이제 사용할 수 있습니다
class X {
public:
template <typename Iter, typename Iter2>
X(Iter b1, Iter e1, Iter2 b2, Iter2 e2)
: mVec(concat_begin(b1,e1,b2,e2), concat_end(b1,e1,b2,e2))
{}
private:
vector<Y> const mVec;
};
또는 당신이 당신의 생성자를 재 선언 할 필요가 없습니다 (난 그냥 생각했다). 호출자가 도우미 함수를 사용하도록합니다.
X x(concat_begin(b1,e1,b2,e2), concat_end(b1,e1,b2,e2));
코드를 확인하지 않았습니다. 머리 꼭대기에서 코드를 입력했습니다. 컴파일 할 수도 있고 할 수도없고, 작동시킬 수도 있고하지 않을 수도 있습니다 ... 그러나 이것을 시작점으로 삼을 수 있습니다.
영리한 솔루션 +1 ... 반복자의 두 범위에 걸쳐있는 반복자 ... nice – veefu
boost :: iterator_facade를 사용하여 작성하는 것이 더 쉽지만이 경우에는 아마도 가장 좋은 방법 일 것입니다. 적어도 우리가 이동 지원을받을 때까지. – Macke
concat_end가 필요하지 않습니다. 생성 된 반복자를 값이 e2 인 T2 유형과 비교하여 bool을 생성 할 수 있습니다. –