|
Программирование >> Операторы преобразования типа
О Обе формы являются объединением алгоритмов сору() и unique(). О Обе формы копируют в приемный интервал, начинающийся с позиции destBeg, все элементы исходного интервала [begend), за исключением смежных дубликатов. О Обе формы возвращают позицию за последним скопированным элементом в приемном интервале (то есть позицию первого элемента, который не был заменен). О Перед вызовом необходимо убедиться в том, что приемный интервал имеет достаточный размер, или использовать итераторы вставки. О Сложность линейная (numberOfElements сравнений или вызовов ор и присваиваний соответственно). Пример использования алгоритма unique copy(); algo/umque2,cpp #lnclude algostuff.hpp using namespace std: bool dlfferenceOne (int elemi, int elern2) return elemi + 1 == elerr2 elemi - 1 == elem2: lnt maInO { Исходные данные int sourceC] =(1,4. 4, 6. 1. 2. 2. 3. 1, 6, 6. 6. 5. 7. 5. 4. 4 ): int sourceNum = sizeof(source)/slzeof(source[0]): Инициализация coll элементами source list<int> coll: copy(source. source+sourceNum. Источник back inserter(coll)): Приемник PRINTJLEMENTSCcoll): ВЫ80Д содержимого coll с удалением смежных дубликатов unique copy(coll .beginO . coll.endO. Источник ostream iterator<1nt>(cout. )): Приемник cout endl: Вывод содержимого coll с удалением смежных элементов со значениями, отличающимися на 1 unlque copy(col 1 .beginO. coll.endO. Источник ostream iterator<int>(cout. ). Приемник differenceOne); Критерий удаления cout endl; Результат выполнения программы выглядит так: 14461223166657544 146123165754 144613166644 Обратите внимание на второй вызов unique copy(). Он не удаляет элементы, отличающиеся от своего предшественника на 1, как могло бы показаться на первый взгляд. Вместо этого он удаляет все элементы, отличающиеся на 1 от предыдущего элемента, который не был удален. Например, после трех экземпляров значения 6 следующие элементы 5, 7 и 5 отличаются от 6 на 1, поэтому все они удаляются. Но следующие два экземпляра значения 4 остаются, поскольку при сравнении с 6 разность не равна 1. В следующем примере сворачиваются последовательности пробелов: algo/unlque3.cpp #1nclude <iostrearn> #1nclude <algorithm> using namespace std: bool bothSpaces (char elerrl. char elem2) { return eleml == && elem2 == : int mainO { По умолчанию начальные пробелы не пропускаются cin.unsetf(ios::sk1pws): /* Копирование стандартного ввода в стандартный вывод * ~ со сверткой пробелов */ un1que copy(istrearr iterator<char>(cin). Начало источника: cin 1stream iterator<char>(), Конец источника: eof 05tream 1terator<char>(cout). Приемник: cout bothSpaces): Критерий удаления Входные данные: Hello, here are sometimes rrore and sometimes fewer spaces, Д.1Я этих входных данных программа выводит следующий результат: Hello, here are sometimes more and sometimes fewer spaces. Перестановочные алгоритмы Перестановочные алгоритмы изменяют порядок следования элементов (но не их значения). Элементы ассоциативных контейнеров хранятся в фиксированном порядке, поэтому они не могут использоваться в качестве приемника для перестановочных алгоритмов. Перестановка элементов в обратном порядке void reverse (Bidirectionallterator beg, Bidirectionallterator enc/) Outputlterator reverse copy (Bidirectionallterator sourceBeg. Bidirectionallterator sourceEnd. Outputlterator destBeg) О Алгоритм reverseO переставляет элементы интервала [beg,end) в обратном порядке. О Алгоритм reverse copy() переставляет в обратном порядке элементы интервала [sourceBeg, sourceEnd) в процессе их копирования в приемный интервал, начинающийся с destBeg. О Алгоритмы возвращают позицию за последним скопированным элементом в приемном интервале (то есть позицию первого элемента, который не был заменен в ходе копирования). О Перед вызовом необходимо убедиться в том, что приемный интервал имеет достаточный размер, или использовать итераторы вставки. О Для списков определена аналогичная функция reverseO, которая часто работает более эффективно, поскольку она меняет внутренние указатели вместо присваивания значений элементам (см. с. 252). О Сложность линейная (numbeЮfElements/2 обменов или numberOfElements присваиваний соответственно). Пример использования алгоритмов reverse() и reverse copy(): algo/reversel.cpp #1nclude algostuff.hpp using namespace std; lnt rrainO { vector<int> col 1: INSERT ELEMENTS(coll,1.9): PRINT ELEMENTS(co11. coll; ): перестаноака элементов в обратном порядке reverse (coll.beginO. coll.endO): PRINT ELEMENTS(coll. coll: ): Перестановка в обратном порядке элементов со второго до предпоследнего reverse (coll .begin()+1. coll ,endO-l): PRINT ELEMENTS(coll. coll: ):
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |