这是一个快速倒计时迭代器:
template<class F,
class T=std::result_of_t<F const&(std::size_t const&)>
>
struct countdown_iterator:
std::iterator<
std::input_iterator_tag,
T,
std::ptrdiff_t,
T*,
T
>
{
using self=countdown_iterator;
std::size_t count_down = 0;
F f;
T operator*() const {
return f(count_down);
}
self& operator++() {
--count_down;
return *this;
}
self operator++(int) {
auto result = *this;
++(*this);
return result;
}
friend bool operator==(self const& lhs, self const& rhs) {
return lhs.count_down == rhs.count_down;
}
friend bool operator!=(self const& lhs, self const& rhs) {
return !(lhs==rhs);
}
};
半途而废的范围类:
template<class It>
struct range {
It b, e;
It begin() const { return b; }
It end() const { return e; }
bool empty() const { return begin()==end(); }
decltype(auto) front() const { return *begin(); }
range():b(),e() {}
range(It s, It f):b(s), e(f) {}
range(range const&)=default;
range& operator=(range const&)=default;
~range() = default;
template<class C,
class=std::enable_if_t<!std::is_same<std::decay_t<C>, range>>
>
range( C&& c ):
range(std::begin(std::forward<C>(c)), std::end(std::forward<C>(c)))
{}
};
template<class It>
range<It> make_range( It b, It e ) { return {std::move(b),std::move(e)}; };
然后我们可以数数:
template<class F,
class dF=std::decay_t<F>,
class It=countdown_iterator<dF>
class R=range<It>
>
R countdown( std::size_t N, F&& f ) {
countdown_iterator e( N, f ):
countdown_iterator b( N, std::forward<F>(f) );
return {std::move(b),std::move(e)};
}
使用:
size_t n = 100;
size_t m = 1000;
auto src = countdown(
n,
[m](auto&&){ std::vector<foo> v; v.reserve(m); return v; }
);
std::vector<std::vector<foo>> v;
v.reserve(100);
v.insert(v.end(), src.begin(), src.end() );
在这里,我们创建了一个可运行 100 个迭代器的倒计时“输入”迭代器。每次取消引用它时,它都会返回一个具有m 容量的向量。