Шаг 292.
Библиотека STL.
Алгоритмы STL. Алгоритмы удаления. Удаление элементов при копировании

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

    Для выполнения этой операции используются следующие алгоритмы:

  OutputIterator
  remove_copy (InputIterator sourceBeg, InputIterator sourceEnd,
               OutputIteratir destBeg,
               const T& value)
  OutputIterator
  remove_copy_if (InputIterator sourceBeg, InputIterator sourceEnd,
                  OutputIterator destBeg,
                  UnaryPredicate op)

    Алгоритм remove_copy() является объединением алгоритмов сору() и remove(). Он удаляет из исходного интервала [beg,end) все элементы, равные value, в процессе копирования элементов в приемный интервал, начинающийся с позиции destBeg.

    Алгоритм remove_copy_if() является объединением алгоритмов сору() и remove_ if(). Он удаляет каждый элемент интервала [beg,end), для которого унарный предикат op(elem) возвращает true. Замена производится в процессе копирования элементов в приемный интервал, начинающийся с позиции destBeg.

    Оба алгоритма возвращают позицию за последним скопированным элементом в приемном интервале (то есть позицию первого элемента, который не был заменен).

    Предикат ор не должен изменять свое состояние во время вызова.

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

    Сложность линейная (numberOfElements сравнений или вызовов ор и присваиваний соответственно).

    Пример использования алгоритмов remove_copy() и remove_copy_if():

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iterator>
#include "algostuff.hpp"

#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}


int main()
{
  list<int> coll1;

  INSERT_ELEMENTS(coll1,1,6);
  INSERT_ELEMENTS(coll1,1,9);
  PRINT_ELEMENTS(coll1,"Исходная коллекция:\n");

  // Вывод содержимого коллекции кроме элементов со значением 3
  cout <<ToRus("Вывод содержимого коллекции кроме элементов со значением 3:\n");
  remove_copy(coll1.begin(), coll1.end(),       // Источник
              ostream_iterator<int>(cout," "),  // Приемник
              3);                               // Удаляемое значение
  cout << endl;

  // Вывод содержимого коллекции кроме элементов со значением, большим 4
  cout <<ToRus("Вывод содержимого коллекции кроме элементов со значением, 
                большим 4:\n");
  remove_copy_if(coll1.begin(), coll1.end(),      // Источник
                 ostream_iterator<int>(cout," "), // Приемник
                 bind2nd(greater<int>(),4));      // Критерий удаления
  cout << endl;

  // Копирование всех элементов, больших 3, в мультимножество
  multiset<int> coll2;
  remove_copy_if(coll1.begin(), coll1.end(),    // Источник
                 inserter(coll2,coll2.end()),   // Приемник
                 bind2nd(less<int>(),4));       // Критерий удаления
  PRINT_ELEMENTS(coll2,"Коллекция 2:\n");


  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    Со следующего шага мы будем рассматривать алгоритмы удаления дубликатов.




Предыдущий шаг Содержание Следующий шаг