c++ Реализация собственного итератора, похожего на directory_iterator из filesystem

В std::filesystem есть directory_iterator, который очень красиво позволяет итерировать директорию:

for(auto& p : std::filesystem::directory_iterator(path)) { /*do smth*/ }

Но как сделать что-то подобное самостоятельно, к примеру, для итерирования чисел, чтобы можно было написать что-то такое:

for(int i : Iterator(10)) { std::clog << i << '\n'; }

И получить в консоль:

0
1
2
3
4
5
6
7
8
9
10

Ответы (1 шт):

Автор решения: KoVadim

Легко. Нужно только определить свой итератор и вспомогательный объект.

#include <iostream>

class my_iterator
{
    int i;
public:
    explicit my_iterator(int position = 0) : i{position} {}
    // значение итератора - собственно число
    int operator*() const { return i;}
    // при переходе вперед, просто увеличиваем содержимое итератора
    my_iterator& operator++() {
        ++i;
        return *this;
    }
    // итератор должен знать, когда останавливаться
    bool operator!=(const my_iterator& other) {
        return i != other.i;
    }
};

class Iterator
{
    int a; // начало диапазона
    int b; // конец

public:
    Iterator(int to) : a{0}, b{to} {}
    my_iterator begin() const { return my_iterator(a);}
    my_iterator end() const { return my_iterator(b);}
};

int main()
{
    for (int i : Iterator(10)) {
        std::cout << i << '\n';
    }
}
→ Ссылка