C++14生成自定义迭代器,该迭代器将按2进行运算并返回修改后的数据
我有一个类范围,它包含一个类似或的间隔 然后我有一个范围列表,我想要一个代表多个范围的向量。出于某种目的,我不需要向量 但我想做一个迭代器,它将遍历范围并重新运行范围。可以定义这样工作的自定义迭代器吗C++14生成自定义迭代器,该迭代器将按2进行运算并返回修改后的数据,c++,iterator,c++14,C++,Iterator,C++14,我有一个类范围,它包含一个类似或的间隔 然后我有一个范围列表,我想要一个代表多个范围的向量。出于某种目的,我不需要向量 但我想做一个迭代器,它将遍历范围并重新运行范围。可以定义这样工作的自定义迭代器吗 class Range { long long lo; long long hi; } class RangeList { vector<long long> ranges; } 所以迭代器将遍历并返回 第一次
class Range {
long long lo;
long long hi;
}
class RangeList {
vector<long long> ranges;
}
所以迭代器将遍历并返回
第一次迭代
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';
}
}
是的,这是可能的-如何:boost::tranform_迭代器?这是可能的,但可能适得其反。你为什么不想要一个向量?我很想使用Ranges=std::vector;,和sidestep RangeListOk谢谢你们的帮助,我会像你们在vector中那样做,我不允许使用boost,但你们是对的:谢谢你们
#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';
}
}