Алгоритм replace_copy_if()
template< class ForwardIterator, class OutputIterator, class Predicate, class Type > OutputIterator replace_copy_if( ForwardIterator first, ForwardIterator last, class OutputIterator result, |
Predicate pred, const Type& new_value );
replace_copy_if()
ведет себя так же, как replace_if(), только новая последовательность копируется в контейнер, начиная с result. Возвращаемый итератор указывает на элемент, расположенный за последним скопированным. Исходный контейнер остается без изменения.
#include <algorithm> #include <vector> #include <iostream.h> /* исходная последовательность: 0 1 1 2 3 5 8 13 21 34 последовательность после применения replace_if < 10 с заменой на 0: 0 0 0 0 0 0 0 13 21 34 последовательность после применения replace_if четное с заменой на 0: 0 1 1 0 3 5 0 13 21 0 */
class EvenValue { public: bool operator()( int value ) { return value % 2 ? false : true; } }; int main() { int new_value = 0; int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 }; vector< int, allocator > vec( ia, ia+10 ); ostream_iterator< int > ofile( cout, " " ); cout << "исходная последовательность:\n"; copy( ia, ia+10, ofile ); cout << '\n'; replace_if( &ia[0], &ia[10], bind2nd(less<int>(),10), new_value );
cout << "последовательность после применения replace_if < 10 " << "с заменой на 0:\n"; copy( ia, ia+10, ofile ); cout << '\n'; replace_if( vec.begin(), vec.end(), EvenValue(), new_value ); cout << "последовательность после применения replace_if четное" << "с заменой на 0:\n"; copy( vec.begin(), vec.end(), ofile ); cout << '\n'; |
}