Những gì bạn đang tìm kiếm cơ bản là một trình lặp mặt tiền tóm tắt đi ngang qua một vài chuỗi.
Vì bạn đến từ nền python, tôi cho rằng bạn quan tâm nhiều hơn đến tính linh hoạt thay vì tốc độ. Bởi tính linh hoạt, tôi có nghĩa là khả năng chuỗi lặp lại thông qua các loại trình tự khác nhau với nhau (vectơ, mảng, danh sách liên kết, tập hợp ...) và theo tốc độ, tôi chỉ phân bổ bộ nhớ từ ngăn xếp.
Nếu đây là trường hợp sau đó bạn có thể muốn nhìn vào any_iterator từ phòng thí nghiệm adobe: http://stlab.adobe.com/classadobe_1_1any__iterator.html
iterator này sẽ cung cấp cho bạn khả năng lặp thông qua bất kỳ loại chuỗi khi chạy. Để chuỗi bạn sẽ có một vectơ (hoặc mảng) của bất kỳ bộ ba thứ ba nào đó, nghĩa là, ba any_iterators cho mỗi dải bạn kết hợp với nhau (bạn cần ba để lặp lại tiến hoặc lùi, nếu bạn chỉ muốn lặp lại hai thì đủ).
Hãy nói rằng bạn muốn chuỗi lặp thông qua một chuỗi các số nguyên:
(psuedo-c chưa được kiểm tra ++ code)
typedef adobe :: any_iterator AnyIntIter;
struct AnyRange { AnyIntIter bắt đầu; curr AnyIntIter; Kết thúc AnyIntIter; };
Bạn có thể xác định phạm vi như:
int int_array [] = {1, 2, 3, 4}; Trình tự AnyRange_0 = {int_array, int_array, int_array + ARRAYSIZE (int_array)};
Lớp RangeIterator của bạn sau đó sẽ có một 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>
Tôi muốn lưu ý rằng giải pháp này rất chậm. Cách tiếp cận tốt hơn, C++ giống như là chỉ lưu trữ tất cả các con trỏ tới các đối tượng mà bạn muốn vận hành và lặp lại thông qua đó. Ngoài ra, bạn có thể áp dụng một functor hoặc một khách truy cập vào phạm vi của bạn.
Tôi tìm thấy điều này: http://echochamber.me/viewtopic.php?f=11&t=19074, thực hiện điều gì đó tương tự, mặc dù không giống như tôi muốn. – ynimous