remove_copy_if
Копирует диапазон элементов из источника с диапазоном назначения, за исключением того, что удовлетворять предикату не копируются, без нарушения работы порядок оставшихся элементов и возвращение конец нового диапазона назначения.
template<class InputIterator, class OutputIterator, class Predicate>
OutputIterator remove_copy_if(
InputIterator _First,
InputIterator _Last,
OutputIterator _Result,
Predicate _Pred
);
Параметры
_First
Итератор ввода адресацию положение первого элемента в диапазоне от, какие элементы удалить._Last
Итератор ввода final адресации позиция одно за элементом в диапазоне от, какие элементы удалить._Result
Итератор вывода положение первого элемента в диапазоне адресации назначения, в котором элементы удалить._Pred
Унарный предикат, который следует выполнить значение элемента быть замещенным.
Возвращаемое значение
Передний итератор адресацию новая конечная позиция диапазона назначения, final одно за элементом последовательности обмылка свободной элементов удовлетворяя предикату.
Заметки
Ссылочное диапазон источника должен быть допустимым; все указатели должны быть dereferenceable и в последовательности последняя позиция доступен из первого инкрементацией.
Должно быть достаточно места в диапазоне назначения, чтобы содержать элементы обмылка, которые копируются после того, как элементы заданного значения будут удалены.
Порядок не удаленных элементов остается стабилизированным.
operator==, используемое для определения равенства между элементами необходимо наложить equivalence связь между ее операндами.
Сложность линейная. (_Last – _First) сравнения на равенство и максимум (_Last – _First) назначения.
remove_copy_if имеет значение 2, связанных форм:
Сведения о том, как эти функции ведут себя см. в разделе Проверяемые итераторы.
Пример
// alg_remove_copy_if.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
bool greater6 ( int value ) {
return value >6;
}
int main() {
using namespace std;
vector <int> v1, v2(10);
vector <int>::iterator Iter1, Iter2, new_end;
int i;
for ( i = 0 ; i <= 9 ; i++ )
v1.push_back( i );
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
v1.push_back( 7 );
random_shuffle ( v1.begin( ), v1.end( ) );
cout << "The original vector v1 is: ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Remove elements with a value greater than 6
new_end = remove_copy_if ( v1.begin( ), v1.end( ),
v2.begin( ), greater6 );
cout << "After the appliation of remove_copy_if to v1,\n "
<< "vector v1 is left unchanged as ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
cout << "Vector v2 is a copy of v1 with values greater "
<< "than 6 removed:\n ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != new_end ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
}
Пример результатов выполнения
The original vector v1 is: ( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 ).
After the appliation of remove_copy_if to v1,
vector v1 is left unchanged as ( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 ).
Vector v2 is a copy of v1 with values greater than 6 removed:
( 1 2 0 3 4 6 5 ).
Требования
заголовок: <algorithm>
std пространство имен: