@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;
}

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

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

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

Похожие вопросы