我有课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>
感谢任何建议
最佳答案
我想我会更具体一点,因为我不喜欢从连续的值列表中推断成对(如果值的数量是奇数会怎样?)
#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';
}
}
关于C++ 14制作自定义迭代器,它将经过2并返回修改后的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55335219/