remove_copy() копирует все элементы, кроме имеющих значение value, в контейнер, на начало которого указывает result. Возвращаемый итератор указывает на элемент за последним скопированным. Исходный контейнер не изменяется.
#include algorithm
#include vector
#include assert.h
#include iostream.h
/* печатается:
исходный вектор:
0 1 0 2 0 3 0 4 0 5
вектор после remove до erase():
1 2 3 4 5 3 0 4 0 5
вектор после erase():
1 2 3 4 5
массив после remove_copy()
1 2 3 4 5
*/
int main()
{
int value = 0;
int ia[] = { 0, 1, 0, 2, 0, 3, 0, 4, 0, 5 };
vector int, allocator vec( ia, ia+10 );
ostream_iterator int ofile( cout," ");
vector int, allocator ::iterator vec_iter;
cout "исходный вектор:\n";
copy( vec.begin(), vec.end(), ofile ); cout '\n';
vec_iter = remove( vec.begin(), vec.end(), value );
cout "вектор после remove до erase():\n";
copy( vec.begin(), vec.end(), ofile ); cout '\n';
// удалить из контейнера неподходящие элементы
vec.erase( vec_iter, vec.end() );
cout "вектор после erase():\n";
copy( vec.begin(), vec.end(), ofile ); cout '\n';
int ia2[5];
vector int, allocator vec2( ia, ia+10 );
remove_copy( vec2.begin(), vec2.end(), ia2, value );
cout "массив после remove_copy():\n";
copy( ia2, ia2+5, ofile ); cout endl;
}
Алгоритм remove_if()
template class ForwardIterator, class Predicate
ForwardIterator
remove_if( ForwardIterator first,
ForwardIterator last, Predicate pred );
remove_if() удаляет из диапазона [first,last) все элементы, для которых значение предиката pred равно true. remove_if() (как и remove()) фактически не исключает удаленные элементы из контейнера. Вместо этого каждый оставляемый элемент перемещается в очередную позицию, начиная с first. Возвращаемый итератор указывает на элемент, следующий за позицией, в которую помещен последний неудаленный элемент. Обычно этот итератор затем передается алгоритму erase(), который удаляет неподходящие элементы. (Для встроенных массивов лучше использовать алгоритм remove_copy_if().) Алгоритм remove_copy_if()
template class InputIterator, class OutputIterator,
class Predicate
OutputIterator
remove_copy_if( InputIterator first, InputIterator last,
OutputIterator result, Predicate pred );
remove_copy_if() копирует все элементы, для которых предикат pred равен false, в контейнер, на начало которого указывает итератор result. Возвращаемый итератор указывает на элемент, расположенный за последним скопированным. Исходный контейнер остается без изменения.
#include algorithm
#include vector
#include iostream.h
/* печатается:
исходная последовательность:
0 1 1 2 3 5 8 13 21 34
последовательность после применения remove_if 10:
13 21 34
последовательность после применения remove_copy_if четное:
1 1 3 5 13 21
*/
class EvenValue {
public:
bool operator()( int value ) {
return value % 2 ? false : true; }
};
int main()
{
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 };
vector int, allocator ::iterator iter;
vector int, allocator vec( ia, ia+10 );
ostream_iterator int ofile( cout, " " );
cout "исходная последовательность:\n";
copy( vec.begin(), vec.end(), ofile ); cout '\n';