あるiterator範囲がソート済みかどうかを調べる,という要求に対して,私は以前からstd::adjacent_findを使うのが癖になっていて「読みにくいコード書いてしまっているのかな?」と思っていたんですが,これってidiomとして一定の認知度を得ているみたいですね.
http://www.talkaboutprogramming.com/group/comp.lang.c++.moderated/messages/162344.html
以下,adjacent_findを使ってソート済みかどうかを確認するコードの例示.
#include#include #include #include #include #include #include #include template inline bool is_sorted(ForwardIterator first, ForwardIterator last, Predicator pred) { return std::adjacent_find(first, last, std::not2(pred)) == last; } template inline bool is_sorted(ForwardIterator first, ForwardIterator last) { typedef typename std::iterator_traits ::value_type value_type; return is_sorted(first, last, std::less ()); } int main(int argc, char *argv[]) { using namespace std; using namespace boost; mt19937 gen(static_cast (time(0))); uniform_int<> dist(numeric_limits ::min(), numeric_limits ::max()); variate_generator > mt_rand(gen, dist); vector v; generate_n(back_inserter(v), 10, mt_rand); // vを乱数で詰める sort(v.begin(), v.end()); // vをソート assert( is_sorted(v.begin(), v.end()) ); // ソート済みだぞ,(゜Д゜)ゴルァ!! copy(v.begin(), v.end(), ostream_iterator (cout, "\n")); // 表示 return 0; }