27 Haziran 2018 Çarşamba

std::partition_point

Giriş
İmzası şöyle.
template<class ForwardIterator, class Predicate> 
ForwardIterator partition_point(ForwardIterator first, ForwardIterator last,
  Predicate pred);
Açıklaması şöyle
An iterator mid such that all_­of(first, mid, pred) and none_­of(mid, last, pred) are both true.
Bir bölünlenmenin nerede bittiğini bulur. lower_bound şu algoritma ile yapılabilirdi. Şöyle yaparız.
template <typename ForwardIterator, typename T>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
    T const& value)
{
    return partition_point(first, last, [&](auto const& elem) {
        return elem < value;
    });
}

template <typename ForwardIterator, typename T, typename Compare>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
    T const& value, Compare comp)
{
    return partition_point(first, last, [&](auto const& elem) {
        return comp(elem, value);
    });
}
Örnek
Elimizde şöyle bir kod olsun
const std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8};
Şöyle yaparız.
auto pred = [](int e){ return e < 5; }
assert(std::is_partition(v.begin, v.end(), pred));
auto it2 = std::partition_point(v.begin, v.end(), pred);

assert(it1 == it2); // *it1 = 5

Hiç yorum yok:

Yorum Gönder