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


remove_if

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

template<class ForwardIterator, class Predicate>
   ForwardIterator remove_if(
      ForwardIterator _First, 
      ForwardIterator _Last,
      Predicate _Pred
   );

Параметры

  • _First
    Передний итератор, указывающий положение первого элемента в диапазоне от, какие элементы удалить.

  • _Last
    Передний итератор, указывающим на позиции одному ", final элементом в диапазоне от, какие элементы удалить.

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

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

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

Заметки

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

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

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

Сложность линейная. (_Last – _First) сравнения на равенство.

Список имеет более эффективную версию функции-члена удалить, relinks указатели.

Пример

// alg_remove_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;
   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 << "Vector v1 is ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   // Remove elements satisfying predicate greater6
   new_end = remove_if (v1.begin( ), v1.end( ), greater6 );

   cout << "Vector v1 with elements satisfying greater6 removed is\n ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   // To change the sequence size, use erase
   v1.erase (new_end, v1.end( ) );

   cout << "Vector v1 resized elements satisfying greater6 removed is\n ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;
}

Пример результатов выполнения

Vector v1 is ( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 ).
Vector v1 with elements satisfying greater6 removed is
 ( 1 2 0 3 4 6 5 3 4 6 8 5 7 7 ).
Vector v1 resized elements satisfying greater6 removed is
 ( 1 2 0 3 4 6 5 ).

Требования

заголовок: <algorithm>

std пространство имен:

См. также

Ссылки

remove_if (STL Samples)

Стандартная библиотека шаблонов