Was Sie suchen im Wesentlichen für eine Fassade Iterator, die Verfahrgeschwindigkeit durch mehrere Sequenzen abstrahiert.
Da Sie von einem Python-Hintergrund kommen Ich nehme an, dass Sie mehr über Flexibilität sorgen, anstatt Geschwindigkeit. Mit Flexibilität meine ich die Fähigkeit, durch verschiedene Sequenztypen (Vektor, Array, verknüpfte Liste, Menge usw.) zu iterieren und mit Geschwindigkeit nur Speicher aus dem Stack zuzuordnen.
Wenn dies der Fall ist, dann mögen Sie vielleicht am any_iterator von Adobe Labs suchen: http://stlab.adobe.com/classadobe_1_1any__iterator.html
Dieser Iterator gibt Ihnen die Möglichkeit, durch eine beliebigen Sequenztyp zur Laufzeit zu durchlaufen. Zur Verkettung würden Sie einen Vektor (oder ein Array) von 3-Tupel-Any_iteratoren haben, das heißt drei Any_iteratoren für jeden Bereich, den Sie verketten (Sie benötigen drei, um vorwärts oder rückwärts zu iterieren, wenn Sie nur vorwärts iterieren wollen, werden zwei ausreichen).
Lassen Sie uns sagen, dass Sie zu Ketten Iterierte durch eine Folge von ganzen Zahlen wollte:
(Ungeprüfte psuedo-C++ Code)
typedef Adobe :: any_iterator AnyIntIter;
struct AnyRange { AnyIntIter beginnen; AnyIntIter curr; AnyIntIter Ende; };
Sie einen Bereich definieren, könnten wie:
int_array int [] = {1, 2, 3, 4}; AnyRange sequenz_0 = {int_array, int_array, int_array + ARRAYSIZE (int_array)};
Ihre RangeIterator-Klasse hätte dann einen 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>
Ich möchte jedoch feststellen, dass diese Lösung sehr langsam ist. Der bessere, C++ - ähnliche Ansatz besteht lediglich darin, alle Zeiger auf die Objekte zu speichern, auf denen Sie arbeiten und diese durchlaufen möchten. Alternativ können Sie einen Funktor oder einen Besucher auf Ihre Bereiche anwenden.
fand ich dies: http://echochamber.me/viewtopic.php?f=11&t=19074, was macht etwas ähnliches, wenn auch nicht so allgemein wie ich mag würde. – ynimous