C ++ 14 Создайте пользовательский итератор, который будет идти на 2 и возвращает измененные данные - PullRequest
0 голосов
/ 25 марта 2019

У меня есть класс Range, который содержит интервал как <2,10> или <-50,900> и чем у меня есть RangeList, и я хочу иметь vector<long long>, который представляет несколько диапазонов. Мне не нужно иметь vector<Range> для какой-то цели.

Но я хочу сделать итератор, который пройдет через ranges, и он будет запускать Range. Можно ли определить пользовательский итератор, который будет работать так?

   class Range {
        long long lo;
        long long hi;
    }

    class RangeList {
    vector<long long> ranges;

    }

пример

ranges={1, 50, 200, 700, 900, 1000};

поэтому итератор пройдет и вернет

первая итерация

Range <1,50>

повторное членство

Range <200,700>

третье слово

Range <900,100>

Спасибо за любой совет

1 Ответ

1 голос
/ 25 марта 2019

Я думаю, что я был бы немного более конкретным, поскольку я не хотел бы выводить пары из последовательного списка значений (что произойдет, если существует нечетное число значений?)

#include <vector>
#include <iostream>

template<class Integer>
struct InclusiveRangeIter
{
    using iterator_category = std::forward_iterator_tag;
    using value_type = Integer;
    using reference = value_type&;
    using pointer = value_type*;
    using difference_type = Integer;

    constexpr InclusiveRangeIter(Integer current)
    : value_(current)
    {}

    constexpr bool operator==(InclusiveRangeIter const& other) const { return value_ == other.value_; }
    constexpr bool operator!=(InclusiveRangeIter const& other) const { return value_ != other.value_; }
    value_type operator*() const { return value_; }
    auto operator++() -> InclusiveRangeIter& { ++value_; return *this; }
    auto operator++(int) -> InclusiveRangeIter { auto copy = *this; ++value_; return copy; }


    Integer value_;
};

struct InclusiveRange 
{
    long long lo;
    long long hi;

    auto begin() const { return InclusiveRangeIter(lo); }
    auto end() const { return InclusiveRangeIter(hi + 1); }
};

int main()
{
    auto ranges = std::vector<InclusiveRange>
    {
        {1, 50}, {200, 700}, {900, 1000}
    };

    for (auto&& ir : ranges)
    {
        auto sep = false;
        for (auto&& v : ir)
        {
            if (sep) std::cout << ", ";
            std::cout << v;
            sep = true;
        }
        std::cout << '\n';
    }
}

https://coliru.stacked -crooked.com / а / 2804de3d85ba4f0b

...