Программирование >>  Операторы преобразования типа 

1 ... 116 117 118 [ 119 ] 120 121 122 ... 239


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

algo/reniove2.cpp #1nclude algostuff.hpp using namespace std:

int rrainO {

11st<int> colli;

INSERT ELEMENTS(colll.l.6): INSERT ELEMENTS(colll.l.9); PRiNTJLEMENTSCcoll 1):

Вывод содержимого коллекции кроме элементов со значением 3 remove copy(colll.beginO . colli.endO. Источник

ostrearr iterator<int>(cout. ), Приемник 3); Удаляемое значение

cout endl:

Вывод содержимого коллекции кроме элементов со значением, большим 4 rerrQve copy if(colll.beginC). colli.endO. Источник ostrearr iterator<int>Ccout. ). Приемник bind2ndCgreater<int>C).4)); Критерий удаления

cout endl;

Копирование всех элементов, больших 3. в мультимножество rrultiset<int> со112;

remove copy if(colll.beginO. colli.endO. Источник inserter(coll2.coll2.endC)). Приемник bind2ndCless<int>0.4)); Критерий удаления

PRINT ELEMENTS(coll2):

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

123456123456789 1245612456789 1 2 3 4 1 2 3 4 445566789

Удаление дубликатов Удаление смежных дубликатов

Forwardlterator

unique CForwardlterator beg, Forwardlterator end) Forwardlterator

unique (Forwardlterator beg. Forwardlterator end. BinaryPredicate op)



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

О Первая форма удаляет из интервала [beg,end) каждый элемент, равный предыдущему элементу. Таким образом, дубликаты удаляются только в том случае, если интервал был предварительно отсортирован (или, по крайней мере, если все элементы с одинаковыми значениями хранятся в смежных позициях).

О Вторая форма удаляет все элементы, следующие за элементом е, для которых бинарный предикат ор{е1етп,е) возвращает true. Иначе говоря, предикат используется для сравнения элемента не с предшественником, а с предыдущим элементом, который не был удален (см. пример).

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

О Алгоритмы заменяют удаленные элементы следующими элементами, которые не были удалены.

О Алгоритмы сохраняют порядок следования элементов, которые пе были удалены.

О Вызывающая сторона должна использовать новый логический конец интервала вместо исходного конца end (за дополнительной информацией обращайтесь на с. 122).

О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь па с. 303.

О Вследствие модификации эти алгоритмы не могут использоваться с ассоциативными контейнерами (см. с. 125).

О Для списков определена аналогичная функция unique(), которая часто работает более эффективно, поскольку она меняет внутренние указатели вместо присваивания значений элементам (см. с. 250).

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

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

algo/uniquel.cpp #include algostuff.hpp using namespace std;

1nt mainO {

Исходные данные

int sourceC] - ( 1. 4. 4. 6. 1. 2. 2. 3. 1. 6, 6. 6. 5. 7. 5. 4. 4 };

int sourceNurr * sizeof(source)/sizeof(source[0]); list<int> coll;

Инициализация coll элементами source copy (source. source+sourceNum. Источник

back inserter(coll)); Приемник



PRiNTJLEMENTSCcoll);

Удаление последовательных дубликатов

list<int>:literator pos;

pos = unique (coll.beginC). coll.endO):

/* Вывод оставшихся элементов * - с использованием нового логического конца */

сору (coll .beginO, pos. Источник

ostream iterator<int>(cout. )): Приемник cout \п\п ;

Повторная инициализация coll элементами source сору (source. source+SQurceNurr, Источник

coll .beginO); Приемник

PRINTjLEMENTS(coll):

Удаление элемента, если ему предшествует элемент с большим значением coll,erase (unique (coll.beginC). coll,end().

greater<int>()). coll,end()): PRINTjLEMENTS(con):

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

14461223166657544 146123165754

14461223166657544 1 4 4 6 6 6 6 7

Первый вызов uniqueO уничтожает последовательные дубликаты. Второй вызов показывает, как работает вторая форма алгоритма. Из коллекции удаляются все элементы, следующие за текущим элементом, для которых сравнение критерием greater дает результат true. Например, первый элемент 6 больше следующих за ним элементов 1, 2, 2, 3 и 1, поэтому все эти элементы удаляются. Иначе говоря, предикат сравнивает элемент не с предшественником, а с предыдущим элементом, который не был удален (другой пример приведен далее при описании алгоритма unique copy()).

Удаление дубликатов при копировании

Outputlterator

unlque copy (Inputlterator sourceBeg. Inputlterator sourceEnd. Outputlterator destBeg)

Outputlterator

un1que copy (Inputlterator sourceBeg, Inputlterator sourceEnd, Outputlterator destBeg. BinaryPredicate op)



1 ... 116 117 118 [ 119 ] 120 121 122 ... 239

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