@rollthebones

Как создать свой итератор для вектора в шаблонном классе?

Есть задание, написать шаблонный класс контейнер, в котором данные должны храниться в виде одной из STL коллекций. Я выбрал хранить их в std::vector.
Мне нужно написать свой двунаправленный итератор, в котором будет перегружен оператор инкремента (++), так, чтобы итератор пробегался по вектору и брал каждый третий элемент. Проблема заключается в том, что как бы я не пробовал его написать, ничего не получается с моим уже написанным классом.
Там у меня есть метод printEachThirdElement, который как раз занимается выводом каждого третьего элемента вектора, но это нужно реализовать как свой итератор. Прошу помощи.

Код шаблонного класса

#include <iostream>
#include <vector>
#include <algorithm>
template <typename T>
class MyVector {
 public:
    MyVector() : vector() {
    }
 
    MyVector(const T& value) : vector() {
        vector.push_back(value);
    }
 
 
    void info() const {
        std::cout << "[ ";
        for (auto &v : vector) {
            std::cout << v << " ";
        }
        std::cout << "]" << std::endl;
    }
 
    std::int32_t size() const {
        return vector.size(); 
    }
 
    void addElement(const T& value) {
        vector.push_back(value);
    }
 
    void removeElements(const T& value) {
        vector.erase(std::remove(vector.begin(), vector.end(), value), vector.end());
    }
 
    void printEachThirdElement() const {
        for (auto i = vector.begin() + 2; i < vector.end(); i+=3) {
            std::cout << *i << " ";
        }
        std::cout << std::endl;
    }
 
 private:
    std::vector<T> vector;
};



Код функции main()

int main() {
    MyVector<int> vInt;
 
    vInt.addElement(5);
    vInt.addElement(6);
    vInt.addElement(7);
    vInt.addElement(5);
    vInt.addElement(15);
    vInt.addElement(12);
    vInt.addElement(5);
    vInt.addElement(51);
    vInt.addElement(666);
    vInt.addElement(5);
    vInt.addElement(15);
    vInt.addElement(12);
    vInt.addElement(5);
    vInt.addElement(51);
    vInt.addElement(666);
 
    std::cout << "Each 3 element" << std::endl;
    vInt.printEachThirdElement();
 
    return 0;
}

  • Вопрос задан
  • 473 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вам, собственно, надо реализовать итератор для вашего класса и возвращать итараторы в begin() и end(). Вот первая статья из гугла, в которой по шагам реализуют итератор.

Вам надо лишь переписать операторы инкримента, чтобы пропускать элементы. Ну и аккуратно считать итератор end, чтобы последовательные инкрименты из begin не проскочили его.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы