Quello che stai cercando in sostanza è un iteratore di facciata che astrae il passaggio attraverso diverse sequenze.
Dato che vieni da uno sfondo pitone, suppongo che ti preoccupi di più della flessibilità piuttosto che della velocità. Per flessibilità intendo la possibilità di eseguire un'iterazione a catena di diversi tipi di sequenza (vettore, array, elenco collegato, set ecc.) E per velocità intendo solo l'allocazione della memoria dallo stack.
Se questo è il caso, allora si consiglia di guardare l'any_iterator dai laboratori di Adobe: http://stlab.adobe.com/classadobe_1_1any__iterator.html
Questo iteratore vi darà la possibilità di scorrere qualsiasi tipo di sequenza in fase di esecuzione. Per concatenare si dovrebbe avere un vettore (o array) di 3-tupla any_iterators, cioè tre any_iterators per ogni intervallo che si incatena (ne occorrono tre per scorrere avanti o indietro, se si desidera solo iterare due avanti sarà sufficiente).
Diciamo che si voleva catena iterate attraverso una sequenza di numeri interi:
(codice non testato pseudo-C++)
typedef adobe :: any_iterator AnyIntIter;
struct AnyRange { AnyIntIter begin; AnyIntIter curr; Fine di AnyIntIter; };
Si potrebbe definire un intervallo come ad esempio:
int INT_array [] = {1, 2, 3, 4}; AnyRange sequence_0 = {int_array, int_array, int_array + ARRAYSIZE (int_array)};
La classe RangeIterator avrebbe quindi un vettore std ::.
<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>
Desidero notare tuttavia che questa soluzione è molto lenta. L'approccio migliore, più simile a C++, è solo quello di archiviare tutti i puntatori agli oggetti su cui vuoi operare e iterare attraverso quello. In alternativa, puoi applicare un funtore o un visitatore ai tuoi intervalli.
ho trovato questo: http://echochamber.me/viewtopic.php?f=11&t=19074, che fa qualcosa di simile, anche se non come generico come vorrei. – ynimous