|
Программирование >> Операторы преобразования типа
О Итераторы destBeg и destEnd пе могут входить в интервал [sourceBeg,sourceEnd). О Алгоритм соруО осуществляет перебор в прямом, а алгоритм copy backward() - в обратном направлении. Данное различие существенно только в том случае, если источник и приемник перекрываются: □ чтобы приемник перекрывал источник с начала, используйте алгоритм соруО, то есть для алгоритма сору() позиция destBeg должна предшествовать позиции sourceBeg, □ чтобы приемник перекрывал источник с конца, используйте алгоритм copy backward(), то есть для алгоритма сору() позиция destBeg должна находиться за позицией sourceBeg. Итак, если третий аргумент ссылается на элемент исходного интервала, определяемого первыми двумя аргументами, используйте другой алгоритм. При этом вместо начала приемного интервала будет передаваться его конец. Пример на с. 374 демонстрирует различия между двумя алгоритмами. О Алгоритма copy if() не существует. Чтобы скопировать только те элементы, которые удовлетворяют заданному критерию, воспользуйтесь алгоритмом remove copy if() (см. с. 373). О Чтобы скопировать элементы в обратном порядке, воспользуйтесь алгоритмом reverse copy() (см. с. 379). Алгоритм reverse copy() работает чуть эффективнее соруО с обратными итераторами. О Перед вызовом необходимо убедиться в том, что приемный интервал имеет достаточный размер, или использовать итераторы вставки. О Примерная реализация алгоритма сору() приведена на с. 275. О Копирование всех элементов контейнера для однотипных контейнеров осуществляется оператором присваивания (см. с. 241), для разнотипных контейнеров - функцией assignO (см. с. 241). О Чтобы удалить элементы в процессе копирования, используйте алгоритмы remove copy() и remove copy if() (см. с. 373). О Чтобы модифицировать элементы в процессе копирования, используйте алгоритм transformO (см. с. 363) или гер1асе соруО (см. с. 370). О Сложность линейная {numberOfElements присваиваний). В следующем примере продемонстрированы простые вызовы сору(); algo/copyl.cpp #include algostuff.hpp using namespace std: lnt mainO { vector<1nt> colli: list<1nt> C0112; INSERT ELEMENTS(C0lll.l.9); /* Копирование элементов colli в со112 * - используем конечный итератор вставки. * чтобы вместо замены производилась вставка зленентов */ сору (colli.beginO , colli.endO, Источник backJnserter(coll2)): Приемник /* Вывод зленентов col 12 * - копирование элементов в cout * с использованием потокового итератора вывода */ сору (со112.beginO. coll2.endO. Источник ostream iterator<int>(cout. )): Приемник cout endl; /* Копирование злементов colli в со112 в обратном порядке * - на этот раз с заменой */ сору (colli.rbeginO. colli.rendO. Источник C0112.beginO): Приемник Повторный вывод злементов col 12 сору (col 12.beginO . coll2.endO. Источник ostreamJterator<int>(cout. )): Приемник cout endl: В этом примере конечный итератор вставки (см. с. 275) вставляет элементы в приемный интервал. Без применения итераторов вставки алгоритм сору() начинает замену в пустой коллекции со112, что приводит к непредсказуемым последствиям. При использовании потоковых итераторов вывода (см. с. 281) в качестве приемника используется стандартный выходной поток. Результат выполнения программы выглядит так: 1 2 3 4 5 6 7 6 9 9 В 7 6 5 4 3 2 1 Следующий пример демонстрирует различия между алгоритмами сору() и сору backward(): algo/copy2.cpp include algostuff.hpp using namespace std; int mainO { /* Инициализация исходной коллекции символами * ..........abcdef.......... vector<char> sourcedO..); for (int c=a; c<= f: С++) { source. push back(c) source.1nsert(source.end().10..); PRINT ELEMENTS(source. source; ): Копирование всех букв с позиции за три элемента перед а vector<char> с1(source,begin().source.endO); copy (cl.begin()+10, cl,begin()+16. Исходный интервал cl.beg1n()+7): Приемный интервал PRINTJLEMENTS (Cl. cl; ); Копирование всех букв с позиции через три элемента после f vector<char> c2(source.begin().source.end()); copy backward (C2.beg1n()+10. c2,begin()+16. Источник c2.beg1n()+19); Приемник PRINT ELEMENTS(c2. c2: ): Обратите внимание: в обоих вызовах сору() и copy backward() третий аргумент не входит в источ:ник. Результат выполнения программы выглядит так: source..........abcdef.......... cl; .......abcabcdef.......... c2: .......... abcabcdef ....... В третьем примере алгоритм сору() обеспечивает фильтрацию данных между стандартными входным и выходным потоками. Программа читает строки и выводит их по одной в каждой строке: algo/соруЗ.срр #1nclude <iostream> #1nclude <algor1th[n> #1nclude <string> using namespace std; int rrainO ( copy (istream iterator<string>(cin). Начапо источника istream iterator<string>(), Конец источника ostream iterator<string>(cout. \n )); Приемник Преобразование и объединение элементов Алгоритм transformO существует в двух вариантах: О первая форма вызывается с четырьмя аргументами и преобразует элементы при копировании из источника в приемник (то есть модификация осуществляется одновременно с копированием); О вторая форма вызывается с пятью аргументами, она объединяет элементы из двух источников и записывает результат в приемник.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |