指定した値分だけiteratorが進んで見える(つまりstd::advance(it, n))ようなiteratorアダプタを作ってみました.
Boost.Rangeのslicedでも同じようなことができるのですが, このアダプタはbase()では元の場所を指したiteratorを返します. 式で書くと*it == *(it.base() + n)になります.
findやlower_boundなどiteratorを返すアルゴリズムで目的の値の一つ手前の要素が欲しいときに使うことを想定しました.
#include "slide_view_iterator.hpp" #include <algorithm> #include <boost/range/irange.hpp> #include <iostream> int main() { auto numbers = boost::irange(0, 10); { auto it = std::lower_bound( canard::make_slide_view_iterator(numbers.begin(), 1) , canard::make_slide_view_iterator(numbers.end()) , 9); std::cout << *it.base() << " is one step short of " << *it << std::endl; } { auto it = std::find( canard::make_slide_view_iterator(numbers.begin(), 2) , canard::make_slide_view_iterator(numbers.end()) , 8); std::cout << *it.base() << " is two step short of " << *it << std::endl; } }
iterator_category等のチェックは未実装です.