Программирование >>  Инициализация объектов класса, структура 

1 ... 383 384 385 [ 386 ] 387 388 389 ... 395


#include <algorithm>

#include <vector>

#include <math.h>

#include <iostream.h>

* печатается:

исходн массив: 3 5 8 13 21

преобразование элементов путем удваания: 6 10 16 26 42 преобразование элементов путем взятия разности: 3 5 8 13 21

double val( int val ) { return val + val; int difference( int vall, int val2 ) {

differe

return abs( vall - val2 ); int main()

int ia[] = { 3, 5, 8, 13, 21 };

vector<int, allocator> vec( 5 ); ostream iterator<int> outfile( cout, );

cout << исходн массив: ; copy( ia, ia+5, outfile ); cout << endl;

cout << преобразование элементов путем удваивания: ; transform( ia, ia+5, vec.begin(), double val ); copy( vec.begin(), vec.end(), outfile ); cout << endl;

cout << преобразование элементов путем взятия разности: ;

transform( ia, ia+5, vec.begin(), outfile, difference ); cout << endl;

template< class ForwardIterator > ForwardIterator unique( ForwardIterator first,

ForwardIterator last ); template< class ForwardIterator, class BinaryPredicate > ForwardIterator unique( ForwardIterator first,

Алгоритм unique()

ForwardIterator last, BinaryPredicate pred );

Все группы равных соседних элементов заменяются одним. В первом варианте при сравнении используется оператор равенства, определенный для типа элементов в контейнере. Во втором варианте два элемента равны, если бинарный предикат pred для них возвращает true. Таким образом, слово mississippi будет преобразовано в misisipi. Обратите внимание, что три буквы i не являются соседними, поэтому они не заменяются одной, как и две пары несоседних s. Если нужно, чтобы все одинаковые элементы были заменены одним, придется сначала отсортировать контейнер.



template< class InputIterator, class OutputIterator > OutputIterator

unique copy( InputIterator first, InputIterator last, OutputIterator result );

template< class InputIterator, class OutputIterator,

class BinaryPredicate > OutputIterator

unique copy( InputIterator first, InputIterator last,

Алгоритм unique copy()

OutputIterator result, BinaryPredicate pred );

unique copy() копирует входной контейнер в выходной, заменяя группы одинаковых соседних элементов на один элемент с тем же значением. О том, что понимается под равными элементами, говорилось при описании алгоритма unique (). Чтобы все дубликаты были гарантированно удалены, входной контейнер необходимо предварительно отсортировать. Возвращаемый итератор указывает на элемент за последним скопированным.

На самом деле поведение unique () интуитивно не совсем очевидно и напоминает remove(). В обоих случаях размер контейнера не изменяется: кажд1й уникальный элемент помещается в очередную позицию, начиная с first.

В нашем примере физически будет получено слово miisisipippi, где ppi - остаток, отходы алгоритма. Возвращаемый итератор указывает на начало этого остатка и обгчно передается алгоритму erase () для удаления ненужных элементов. (Поскольку для встроенного массива операция erase() не поддерживается, то лучше воспользоваться алгоритмом unique copy().)



#include <algorithm> #include <vector> #include <string> #include <iterator> #include <assert.h>

template <class Type>

void print elements( Type elem ) { cout << elem << ; }

void (*pfi)( int ) = print elements; void (*pfs)( string ) = print elements;

int main()

int ia[] = { 0, 1, 0, 2, 0, 3, 0, 4, 0, 5 };

vector<int,allocator> vec( ia, ia+10 ); vector<int,allocator>::iterator vec iter;

последовательность не изменяется: нули не стоят рядом печатается: 0 1 0 2 0 3 0 4 0 5

vec iter = unie( vec.begin (), vec.end() );

for each( vec.begin(), vec.end(), pfi ); cout << \n\n ;

отсортировать вектор, затем применить unique: модифуется печатается: 0 1 2 3 4 5 2 3 4 5

sort( vec.begin(), vec.end() );

vec iter = unie( vec.begin(), vec.end() ); for each( vec.begin(), vec.end(), pfi ); cout << \n\n ;

удать из контейнера ненужнхе элементы печатается: 0 1 2 3 4 5

for each( vec.begin(), vec.end(), pfi ); cout << \n\n ;

string sa[] = { enough , is , enough , enough , is , good };

vector<string,allocator> svec( sa, sa+6 ); vector<string,allocator> vec result( svec.size() ); vector<string,allocator>::iterator svec iter;

sort( svec.begin(), svec.end() );

svec iter = unie copy( svec.begin(), svec.end(), vec result.begin() );

печатается: enough good is

for each( vec result.begin(), svec iter, pfs ); cout << \n\n ;



1 ... 383 384 385 [ 386 ] 387 388 389 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика