基于范围的 for
的原则是对整个范围进行迭代。
然而,您决定范围是什么,因此可以对范围本身进行操作。
template <typename It>
class RangeView {
public:
typedef It iterator;
RangeView(): _begin(), _end() {}
RangeView(iterator begin, iterator end): _begin(begin), _end(end) {}
iterator begin() const { return _begin; }
iterator end() const { return _end; }
private:
iterator _begin;
iterator _end;
};
template <typename C>
RangeView<typename C::iterator> rangeView(C& c, size_t begin, size_t end) {
return RangeView<typename C::iterator>(
std::next(c.begin(), begin),
std::next(c.begin(), end)
);
}
template <typename C>
RangeView<typename C::const_iterator> rangeView(C const& c, size_t begin, size_t end) {
return RangeView<typename C::const_iterator>(
std::next(c.begin(), begin),
std::next(c.begin(), end)
);
}
好的,这个看起来很像 Boost.Range...
现在,让我们使用它!
for (auto i: rangeView(set, 1, 10)) {
}
vector
的前 n 个值:for (auto val : vec | sliced(0,n)) {...}
。请参阅sliced
, from Boost.Range。 - Luc Touraillefor
的目的是为了更轻松地迭代整个范围。其目的并不是完全替代非 rangefor
。有些情况下你需要使用常规的for
;rangefor
只是一种常见迭代模式的语法糖。它不能覆盖所有情况,也不应该这样做。 - Nicol Bolasstd::copy
和infix_ostream_iterator
。 - Jerry Coffin