Поделиться через


remove_copy_if

Копирует элементы из диапазона источника в качестве назначения, за исключением того, что удовлетворять предикату не копируются без нарушения порядок остальных элементов и возвращая конец назначения нового диапазона.

template<class InputIterator, class OutputIterator, class Predicate> 
   OutputIterator remove_copy_if( 
      InputIterator _First,  
      InputIterator _Last,  
      OutputIterator _Result, 
      Predicate _Pred 
   );

Параметры

  • _First
    Итератор ввода слишком позицию первого элемента в диапазоне от элементов удаления.

  • _Last
    Итератор ввода слишком положение за одно окончательное элементом в диапазоне от элементов удаления.

  • _Result
    Итератор вывода слишком позицию первого элемента в диапазоне назначения для элементов, удалить.

  • _Pred
    Унарный предикат, должен быть удовлетворен значение элемента могли быть.

Возвращаемое значение

Передний итератор слишком новая конечная позиция диапазона назначения, одно окончательное за элементом последовательности обмылка свободно элементов удовлетворяя предикату.

Заметки

Указанный диапазон источника должен быть допустимым; все указатели должны быть dereferenceable и внутри последовательности последнего положения доступен из первого инкрементацией.

Должно быть достаточным объемом памяти в диапазоне назначения, чтобы содержать элементы обмылка, будут отменены после того, как элементы заданного значения будут удалены.

Порядок не удаленных элементов оно остается.

operator== используется, чтобы определить равенство между элементами должен создать связь между ее эквивалентности операндами.

Сложность линейная: (_Last — _First) сравнения на равенство и не более (_Last — _First) назначения.

remove_copy_if имеет две связанные формы:

Дополнительные сведения о том, как ведут себя эти функции, см. в разделе Проверяемые итераторы.

Пример

// 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

См. также

Ссылки

remove_copy_if (примеры STL)

Библиотека стандартных шаблонов