Файл заголовка 'boost/algorithm/gather.hpp' содержит два варианта одного алгоритма,<gather
>.
<gather()
>берет набор элементов, определенных парой итераторов, и перемещает те, которые удовлетворяют их предикату, в положение (называемое поворотом) в последовательности. Алгоритм стабилен. Результатом является пара итераторов, которые содержат элементы, удовлетворяющие предикату.
Функция<gather
>возвращает<std::pair
>итераторов, которые обозначают элементы, удовлетворяющие предикату.
Есть две версии: одна занимает два итератора, а другая занимает диапазон.
namespace boost { namespace algorithm {
template <typename BidirectionalIterator, typename Pred>
std::pair<BidirectionalIterator,BidirectionalIterator>
gather ( BidirectionalIterator first, BidirectionalIterator last, BidirectionalIterator pivot, Pred pred );
template <typename BidirectionalRange, typename Pred>
std::pair<typename boost::range_iterator<const BidirectionalRange>::type, typename boost::range_iterator<const BidirectionalRange>::type>
gather ( const BidirectionalRange &range, typename boost::range_iterator<const BidirectionalRange>::type pivot, Pred pred );
}}
Дана последовательность, содержащая:
0 1 2 3 4 5 6 7 8 9
Призыв к сбору (arr, arr + 10, arr + 4, IsEven) приводит к:
1 3 0 2 4 6 8 5 7 9
|---|-----|
first | second
pivot
где<first
>и<second
>— поля пары, возвращаемые вызовом.
<gather
>работать на двунаправленных итераторах или лучше. Это требование вытекает из использования<stable_partition
>, которое требует двунаправленных итераторов. Некоторые стандартные библиотеки (например, libstdc++ и libc++) имеют реализации<stable_partition
>, которые работают с передовыми итераторами. Если это так, то<gather
>также будет работать с передовыми итераторами.
<gather
>использует<stable_partition
>, который будет пытаться выделить временную память, но будет работать in-situ, если ее нет.
Если же нет памяти, то время работы<O(N
logN)
>.