読者です 読者をやめる 読者になる 読者になる

<boost/detail/algorithm.hpp>

C++

すぐ忘れるのでメモ。
<boost/detail/algorithm.hpp>には、is_sorted、iotaといったC++0xで導入されるアルゴリズムや
いくつかの範囲アルゴリズムが定義されています。

#include <vector>
#include <boost/detail/algorithm.hpp> // is_sorted, sort
#include <boost/assert.hpp>
#include <pstade/oven/initial_values.hpp>
#include <pstade/oven/equals.hpp>

namespace oven = pstade::oven;

int main()
{
    std::vector<int> v = oven::initial_values(3, 1, 2);

    BOOST_ASSERT(!boost::is_sorted(v));

    boost::sort(v);

    BOOST_ASSERT(boost::is_sorted(v));
    BOOST_ASSERT(oven::equals(v, oven::initial_values(1, 2, 3)));
}

以下は定義されているアルゴリズムの一覧。

namespace boost {

// 連続した値の生成
template <class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value);

template <typename Container, typename T>
void iota(Container& c, const T& value);
 
// std::copyの範囲版
template <typename Container, typename OutIter>
OutIter copy(const Container& c, OutIter result);

// std::equalの範囲版(サイズチェックあり)
template <typename Container1, typename Container2>
bool equal(const Container1& c1, const Container2& c2);

// std::sortの範囲版
template <typename Container>
void sort(Container& c);

template <typename Container, typename Predicate>
void sort(Container& c, const Predicate& p);

// std::stable_sortの範囲版
template <typename Container>
void stable_sort(Container& c);

template <typename Container, typename Predicate>
void stable_sort(Container& c, const Predicate& p);

// std::find_ifのboolを返す版
template <typename InputIterator, typename Predicate>
bool any_if(InputIterator first, InputIterator last, Predicate p);

template <typename Container, typename Predicate>
bool any_if(const Container& c, Predicate p);

// std::findのboolを返す版
template <typename InputIterator, typename T>
bool container_contains(InputIterator first, InputIterator last, T value);

template <typename Container, typename T>
bool container_contains(const Container& c, const T& value);

// std::countの範囲版
template <typename Container, typename T>
std::size_t count(const Container& c, const T& value);

// std::count_ifの範囲版
template <typename Container, typename Predicate>
std::size_t count_if(const Container& c, Predicate p);

// 範囲がソート済みかどうかを判定
template <typename ForwardIterator>
bool is_sorted(ForwardIterator first, ForwardIterator last);

template <typename ForwardIterator, typename StrictWeakOrdering>
bool is_sorted(ForwardIterator first, ForwardIterator last, StrictWeakOrdering comp);

template <typename Container>
bool is_sorted(const Container& c);

template <typename Container, typename StrictWeakOrdering>
bool is_sorted(const Container& c, StrictWeakOrdering comp);

} // namespace boost

detailにあるので使用する場合は自己責任で。