昨日のエントリの一個ずらしリスト。
あれを使って範囲がソート済みかどうかを判定します。
#include <boost/assert.hpp> #include <pstade/oven/zipped.hpp> #include <pstade/oven/popped.hpp> #include <pstade/oven/dropped.hpp> #include <pstade/oven/any_range.hpp> #include <pstade/oven/initial_values.hpp> #include <pstade/oven/forall.hpp> namespace oven = pstade::oven; namespace shand { struct tuple_comp { template <class Tuple> bool operator()(const Tuple& x) const { return boost::get<0>(x) <= boost::get<1>(x); } }; template <class R> bool is_sorted(const R& r) { return oven::forall( boost::make_tuple(r | oven::popped, r | oven::dropped(1)) | oven::zipped, tuple_comp()); } } int main() { BOOST_ASSERT(!shand::is_sorted(oven::initial_values(3, 1, 4, 5, 2, 6))); BOOST_ASSERT(shand::is_sorted(oven::initial_values(1, 2, 3, 4, 5, 6))); }
{(1, 2), (2, 3), (4, 5)}の各タプルの要素を比較するだけで済みます。
修正履歴:
2010/06/23 17:28 : 自前のall_ofアルゴリズムをoven::forallに差し替え