C++ 实现 Python 风格的 range for
2021-04-14 本文已影响0人
奇点创客
不支持 step 为负数的情况
#include <concepts>
#include <iostream>
template<std::integral I = int>
class range_iterator
{
public:
range_iterator(I value, I step) : value_{ value }, step_{ step } {}
range_iterator& operator++() { value_ += step_; return *this; }
bool operator!= (const range_iterator& other) { return value_ < other.value_; }
I& operator*() { return value_; }
private:
I value_, step_;
};
template<std::integral I = int>
class range
{
public:
explicit range(I stop) : start_{ 0 }, stop_{ stop }, step_{ 1 } {}
range(I start, I stop, I step = 1) : start_{ start }, stop_{ stop }, step_{ step } {}
range_iterator<I> begin() { return range_iterator<I>(start_, step_); }
range_iterator<I> end() { return range_iterator<I>(stop_, step_); }
private:
I start_, stop_, step_;
};
int main()
{
for (auto i : range(10))
std::cout << i << " ";
std::cout << std::endl;
for (auto i : range(1, 10))
std::cout << i << " ";
std::cout << std::endl;
for (auto i : range(1, 100, 5))
std::cout << i << " ";
std::cout << std::endl;
}