На этом шаге мы рассмотрим использование алгоритмов, удаляющих элементы при копировании.
Для выполнения этой операции используются следующие алгоритмы:
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. Результат работы приложения
Со следующего шага мы будем рассматривать алгоритмы удаления дубликатов.