c++ - C ++ 14制作自定义迭代器,它将按2并返回修改后的数据
问题描述
我有一个类Range
,它包含一个类似于<2,10>
or<-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';
}
}
推荐阅读
- mongodb - MongoDB mongorestore 非分片集合到分片集合
- c# - 试图建立一个保存/加载系统,需要帮助将值从一个类加载到另一个
- regex - 在正则表达式中保持前瞻值
- java - 如何设置在 Java 代码中创建的文件的创建日期?
- c - GCC 警告我指令输出截断
- build - 我使用 Tailwind 制作的 CSS 不适用于使用 gridsome 构建 netlify
- vba - 根据值将数据从一个工作簿复制到另一个工作簿
- node.js - CasperJS 已被重定向,然后以 status=fail (HTTP 302) 退出
- java - 如何将我的应用程序从 android studio 与 amadeus api 连接
- scala - 为什么最多 4 个元素的集合是有序的,而更大的则不是?