Я хотел бы найти чистый способ немного изменить способ работы std :: vector.
Фон проблемы
Мне нужно иметь индекс в векторе, где указатель по существу сдвинется на один назад, например; если мой вектор содержит {0,1,2,3,4,5} и индекс [3] должен проскользнуть, при итерации по вектору он должен вернуть: 0, 1, 2, 3, 3, 4, 5
Проблема
Можно ли без перезаписи всего векторного класса и реализации моих изменений унаследовать std::vector<T>
в настраиваемый класс и переопределить поведение итераторов ++ оператор, а также вектор :: begin ()? (чтобы добавить памяти о том, что он уже соскользнул, и чтобы не поскользнуться снова)
То, что я пробовал
До сих пор я пробовал в основном реализацию, но застряли при попытке переопределить функцию begin ().
#include <vector>
#include <iostream>
#include <iterator>
template <typename T>
class myVector : public std::vector<T>{
public:
class myIterator : public std::vector<T>::iterator
{
// call vector's iterotor constructor
//override
// iterator& operator++(void){}
// iterator operator++(int){}
};
using std::vector<T>::vector; // use the constructor from vector
// extend the begin function, but include original operation
myVector::myIterator begin() const
{
std::cout << "hi\n"; // testing to see if begin has been overriden properly
return std::vector<T>::begin();
}
};
// print out the vector
template <typename T>
std::ostream& operator<<(std::ostream& os, const myVector<T>& v)
{
auto begin=v.begin();
while (begin!=v.end())
{
os << *begin;
++begin;
if(begin!=v.end())
{
os << ',';
}
}
return os;
}
int main() {
myVector<int> vec = {1,2,3,4};
std::cout << vec << '\n';
}
Если у вас есть альтернативные чистые решения, это тоже приветствуется.
Спасибо