Ce que vous recherchez essentiellement, c'est un itérateur de façade qui permet d'abstraire la traversée à travers plusieurs séquences.
Puisque vous venez d'un environnement python, je suppose que vous vous souciez plus de la flexibilité que de la vitesse. Par flexibilité, j'entends la capacité d'enchaîner les différents types de séquences (vecteur, tableau, liste chaînée, ensemble, etc ...) et par vitesse je veux seulement allouer de la mémoire à partir de la pile.
Si tel est le cas, alors vous voudrez peut-être regarder le any_iterator des laboratoires d'adobe: http://stlab.adobe.com/classadobe_1_1any__iterator.html
Ce iterator vous donnera la possibilité de parcourir tout type de séquence lors de l'exécution. Pour enchaîner vous auriez un vecteur (ou un tableau) de 3 tuple any_iterators, c'est-à-dire trois any_iterators pour chaque chaîne que vous enchaînez (vous avez besoin de trois pour itérer vers l'avant ou vers l'arrière, si vous voulez itérer vers l'avant deux suffiront).
Disons que vous vouliez chaîne itérer par une suite d'entiers:
(c-Untested psuedo Code ++)
typedef adobe :: any_iterator AnyIntIter; Struct anyRange { AnyIntIter begin; AnyIntIter curr; Fin AnyIntIter; };
Vous pouvez définir une plage telle que:
int int_array [] = {1, 2, 3, 4}; AnyRange sequence_0 = {int_array, int_array, int_array + ARRAYSIZE (int_array)};
Votre classe RangeIterator aurait alors un vecteur std :: vector.
<code>
class RangeIterator {
public:
RangeIterator() : curr_range_index(0) {}
template <typename Container>
void AddAnyRange(Container& c) {
AnyRange any_range = { c.begin(), c.begin(), c.end() };
ranges.push_back(any_range);
}
// Here's what the operator++() looks like, everything else omitted.
int operator++() {
while (true) {
if (curr_range_index > ranges.size()) {
assert(false, "iterated too far");
return 0;
}
AnyRange* any_range = ranges[curr_range_index];
if (curr_range->curr != curr_range->end()) {
++(curr_range->curr);
return *(curr_range->curr);
}
++curr_range_index;
}
}
private:
std::vector<AnyRange> ranges;
int curr_range_index;
};
</code>
Je tiens à noter cependant que cette solution est très lente. La meilleure approche de type C++ consiste simplement à stocker tous les pointeurs vers les objets sur lesquels vous voulez opérer et à parcourir. Alternativement, vous pouvez appliquer un foncteur ou un visiteur à vos plages.
J'ai trouvé ceci: http://echochamber.me/viewtopic.php?f=11&t=19074, qui fait quelque chose de similaire, mais pas aussi générique que je voudrais. – ynimous