Я создал простой кольцевой буфер, унаследовав std :: vector и перегрузив его operator [], чтобы модулировать желаемый индекс с размером вектора:
template <typename T>
class circvector : public std::vector<T> {
public:
T& operator[](size_t index) { return *(this->data() + index%this->size()); }; // modulo index by vector size when accessing with [] operator
};
int main()
{
circvector<int> buffer; // create a circvector
buffer.resize(10); // resize it
std::iota(buffer.begin(), buffer.end(), 0); // fill with monotonically increasing integers
for (int i = 0; i < buffer.size() * 2; i++)
std::cout << buffer[i] << " "; // access elements with [] beyond the circvector size is safe
}
который правильно производит вывод:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
Я также хотел бы создать «умный» итератор прямого ввода, который поддерживает оператор ++ (приращение) и оператор * (разыменование) и который автоматически «оборачивается» при продвижении мимо последнего элемента в векторе назад к началу базового вектора, с которым он связан.
Этот гипотетический итератор позволит, например, упростить выполнение некоторых функций в библиотеке алгоритмов (которые часто принимают итераторы в качестве аргументов) на подмножестве кругового вектора без добавления логики для проверки, а затем разделить на два отдельных вызова, когда желаемое подмножество охватывает конец-> начало обтекания кругового вектора.
Я читал о создании пользовательских итераторов, но описания становятся довольно запутанными с информацией, которая, по-видимому, удовлетворяет требованиям, которые я не думаю, которые мне нужны. Добавьте к этому обсуждение недавнего отказа от std :: iterator, и я не уверен, где даже начать создавать свой собственный итератор или связывать его с моим классом circvector.
Может ли кто-нибудь помочь мне начать работу с минимально работоспособным шаблоном?
std::stack
begin
иend
? Кроме того, если он завершится, как некоторые алгоритмы узнают, где находится конец? - person zdf   schedule 16.11.2019push_back
иpop_front
. - person zdf   schedule 17.11.2019