?
Taurin schrieb:
Erhoffte Ausgabe:
02468
0103050709
Ok.
Taurin schrieb:
Soweit ich es verstanden habe, müsste ich am besten einen iterator und einen const_iterator implementieren, die jeweils eine Referenz auf myContainer beinhalten und einen Index. Zusätzlich werden die Operatoren * und (zweimal?) ++ überladen. Würde man solche Iteratoren von "Standard-Iteratoren" ableiten? Überläd man auch den op->?
Je nachdem, was es für ein Iterator werden soll (Es gibt unterschiedliche verfeinerte Konzepte). Hier bietet sich an, ein Iterator-Klassen-Template zu schreiben, welches beide Iteratoren (den von dem "backend"-Container und dem, von dem Index-Container). Damit sparst Du Dir auch zwei Versionen für const und nicht-const:
// RAIter: RandomAccessIterator für die Werte
// IndexIter: Ein Iterator für die Indizes
template<typename RAIter, typename IndexIter>
class indexed_iter
{
public:
typedef typename std::iterator_traits<RAIter>::value_type value_type;
typedef typename std::iterator_traits<RAIter>::pointer pointer;
typedef typename std::iterator_traits<RAIter>::reference reference;
typedef typename std::iterator_traits<IndexIter>::iterator_category iterator_category;
typedef typename std::iterator_traits<IndexIter>::difference_type difference_type;
indexed_iter(RAIter backend, IndexIter idxiter)
: backend(backend), idxiter(idxiter) {}
reference operator*() const {return backend[*idxiter];}
indexed_iter& operator++() {++idxiter;}
.....
private:
RAIter backend;
IndexIter idxiter;
};
(Code nicht getestet)
Was ein RandomAccessIterator noch so können muss, kann man nachlesen. Ich sehe gerade, Dravere ist mir zuvor gekommen. Ich stimme ihm zu, was unsigned als Index angeht. Man sollte auch die 5 typedefs (oder eine Spezialisierung von std::iterator_traits) auch nicht vergessen.
Gruß,
SP