考虑以下顺序:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
我有该序列的输入迭代器。我想将这些迭代器包装在产生以下序列的迭代器上:
(1,2), (3,4), (5,6), (7,8), (9,10)
如果不清楚,这个序列是来自原始元素的连续元素对的序列。虽然原始元素有 10 个元素,但这个元素有 5 个:每个元素都是从原始序列中的两个元素中获得的。
我正在使用 Boostiterator_facade
来实现这一点,但我对此有错误的尝试:
template <typename Iterator>
struct pairing_iterator
: boost::iterator_facade<
pairing_iterator<Iterator>,
std::array<typename std::iterator_traits<Iterator>::value_type, 2>,
std::input_iterator_category
// I should probably customize reference too, but it's not relevant
> {
pairing_iterator(Iterator it) : it(it) {
increment(); // A
}
pairing_iterator::value_type dereference() const {
return pair;
}
bool equal(pairing_iterator const& that) const {
return it == that.it; // B
}
void increment() {
pair = { { *it++, *it++ } };
}
Iterator it;
pairing_iterator::value_type pair;
};
我面临的一个问题是在标有 A 的行上:当传入的迭代器是结束迭代器时,这将导致它递增,这是我做不到的。
另一个在标有 B 的行上:我将底层迭代器始终保持在“当前”对之前,因此如果迭代器位于最后一对,则底层迭代器将是结束迭代器,因此将 true 与结束pairing_iterator。
如果底层迭代器是一个前向迭代器,我可以在每次取消引用时简单地读取该对,并在增量时简单地推进两次。但是对于输入迭代器,我只能读取一次。
我是在重新发明一个已经存在于某处的轮子吗?我在 Boost 中没有找到类似的东西,这让我有点惊讶。但我很想找到一个现成的解决方案。
如果这个轮子还没有出来,我怎样才能让它真正滚动呢?