prev_permutation() берет последовательность, ограниченную диапазоном [first,last), и, рассматривая ее как перестановку, возвращает предшествующую ей (о том, как упорядочиваются перестановки, говорилось в разделе 12.5). Если предыдущей перестановки не существует, алгоритм возвращает false, иначе true. В первом варианте для определения предыдущей перестановки используется оператор "меньше" для типа элементов контейнера, а во втором - бинарная операция сравнения, заданная программистом.
#include algorithm
#include vector
#include iostream.h
// печатается: n d a n a d d n a d a n a n d a d n
int main()
{
vector char, allocator vec( 3 );
ostream_iterator char out_stream( cout, " " );
vec[0] = 'n'; vec[1] = 'd'; vec[2] = 'a';
copy( vec.begin(), vec.end(), out_stream ); cout "\t";
// сгенерировать все перестановки "dan"
while( prev_permutation( vec.begin(), vec.end() )) {
copy( vec.begin(), vec.end(), out_stream );
cout "\t";
}
cout "\n\n";
}
Алгоритм random_shuffle()
template class RandomAccessIterator
void
random_shuffle( RandomAccessIterator first,
RandomAccessIterator last );
template class RandomAccessIterator,
class RandomNumberGenerator
void
random_shuffle( RandomAccessIterator first,
RandomAccessIterator last,
RandomNumberGenerator rand);
random_shuffle() переставляет элементы из диапазона [first,last) в случайном порядке. Во втором варианте можно передать объект-функцию или указатель на функцию, генерирующую случайные числа. Ожидается, что генератор rand возвращает значение типа double в интервале [0,1].
#include algorithm
#include vector
#include iostream.h
int main()
{
vector int, allocator vec;
for ( int ix = 0; ix 20; ix++ )
vec.push_back( ix );
random_shuffle( vec.begin(), vec.end() );
// печатает:
// random_shuffle для последовательности 1 .. 20:
// 6 11 9 2 18 12 17 7 0 15 4 8 10 5 1 19 13 3 14 16
cout "random_shuffle для последовательности 1 .. 20:\n";
copy( vec.begin(), vec.end(), ostream_iteratorint ( cout,""));
}
Алгоритм remove()
template class ForwardIterator, class Type
ForwardIterator
remove( ForwardIterator first,
ForwardIterator last, const Type &value );
remove() удаляет из диапазона [first,last) все элементы со значением value. Этот алгоритм (как и remove_if()) на самом деле не исключает элементы из контейнера (т.е. размер контейнера сохраняется), а перемещает каждый оставляемый элемент в очередную позицию, начиная с first. Возвращаемый итератор указывает на элемент, следующий за позицией, в которую помещен последний неудаленный элемент. Рассмотрим, например, последовательность {0,1,0,2,0,3,0,4}. Предположим, что нужно удалить все нули. В результате получится последовательность {1,2,3,4,0,4,0,4}. 1 помещена в первую позицию, 2 - во вторую, 3 - в третью и 4 - в четвертую. Элементы, начиная с 0 в пятой позиции, - это "отходы" алгоритма. Возвращенный итератор указывает на 0 в пятой позиции. Обычно этот итератор затем передается алгоритму erase(), который удаляет неподходящие элементы. (При работе со встроенным массивом лучше использовать алгоритмы remove_copy() и remove_copy_if(), а не remove() и remove_if(), поскольку его размер невозможно изменить) Алгоритм remove_copy()
template class InputIterator, class OutputIterator,
class Type
OutputIterator
remove_copy( InputIterator first, InputIterator last,
OutputIterator result, const Type &value );