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

1 ... 118 119 120 [ 121 ] 122 123 124 ... 239


Вывод всех элементов в обратном порядке reverse copy (со11 .beginO , coll.endO, Источник

ostreani iterator<int>(cout, )): Приемник

cout endl;

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

соП coll coll

1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 923456781

1 8 7 6 5 4 3 2 9

Циклический сдвиг элементов Циклический сдвиг элементов внутри интервала

void

rotate (Forwardlterator beg. Forwardlterator newBeg. Forwardlterator end)

О Производит циклический сдвиг элементов в интервале [beg,end). После вызова *newBeg становится новым первым элементом.

О Перед вызовом необходимо убедиться в том, что newBeg представляет действительную позицию в интервале [begend); в противном случае вызов приводит к непредсказуемым последствиям.

О Сложность линейная (ие более numberOfElements обменов).

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

algo/rotatel.cpp include algostuff,hpp using namespace std;

Int mainO (

vector<int> coll;

lNSERTJLEMENTS(coll.l,9); PRiNTJLEMENTSCcoll. coll: );

Циклический сдвиг на один элемент влево rotate (coll .beginO, Начало интервала

coll.beginO + 1, Новый первый элемент

coll.endO): Конец интервала

PRINT ELEMENTS(coll. one left: );

Циклический сдвиг на два элемента вправо rotate (coll .beginO. Начало интервала

coll.endO - 2. Новый первый элемент

coll.endO); Конец интервала

PRINT ELEMENTSCcoll. two right: ):



Циклический сдвиг, в результате которого элемент со значением 4 переходит в начало

rotate (coll.beginO. Начало интервала

find(coll-beginO.coll ,end() .4). Новый первый элемент coll.endO): Коней интервала

PRINT ELEMENTS(coll. 4 first: );

Как видно из приведенного примера, циклический сдвиг влево осуществляется с положительным смещением от начала, а сдвиг вправо - с отрицательным смещением от конца. Тем не менее прибавление смещения к итератору возможно только при использовании итераторов произвольного доступа (векторы поддерживают такие итераторы). Без итераторов произвольного доступа необходима функция advance() (см. далее пример применения функции rotate copy()).

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

coll: 123456789

one left: 234567891 two right: 9 12 3 4 5 6 7 8 4 first: 4 5 6 7 8 9 12 3

Циклический сдвиг элементов при копировании

Outputlterator

rotate copy (Forwardlterator sourceBeg. Forwardlterator newBeg, Forwardlterator sourceEnd. Outputlterator destBeg)

О Алгоритм является объединением алгоритмов сору() и rotate().

О Копирует элементы интервала [sourceBeg,sourceEnd) в приемный интервал, начинающийся с destBeg. При этом элементы циклически сдвш-аются так, что newBeg становится новым первым элементом.

О Возвращает позицию за последним скопированным элементом в приемном интервале.

О Перед вызовом необходимо убедиться в том, что newBeg представляет элемент в интервале [begend); в противном случае вызов приводит к непредсказуемым последствиям.

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

О Источник не должен перекрываться с приемником.

О Сложность линейная (не более numberOfElements обменов).

Следующая программа демонстрирует использование алгоритма rotate copy():

algo/rotate2.cpp Iinclude algostuff.hpp using namespace std:



int mainO (

set<int> coll:

INSERTJLEMENTS(C0ll.l.9) PRINT ELEMENTS(coll);

Вывод элементов с циклическим сдвигом на одну позицию влево set<int>;:iterator pos = col 1.beginC); advanceCpos.l): rotate copy(col1.beginC). pos.

coll.endC).

ostream i terator<1nt>C cout. cout endl;

Начало источника Новый первый элемент Конец источника )); Приемник

Вывод элементов с циклическим сдвигом на две позиции вправо роз = coll.endC): advance(pos.-2): rotate copy(col 1.begi n С). pos.

coll.endC).

ostream iterator<int>(cout. )) cout endl;

Начало источника

Новый первый элемент

Конец источника

Приемник

Вывод элементов с циклическим сдвигом, в результате которого элемент со значением 4 переходит в начало

rotate copyCcoll .beginO.

coll.findC4). coll.endC).

ostream iterator<1nt>Ccout. cout endl:

Начало источника

Новый первый элемент

Конец источника

Приемник

В отличие от приведенного ранее примера для алгоритма rotate() (см. с. 380) в данном случае вместо вектора используется множество. Смена контейнера влечет за собой два следствия:

О изменение итератора должно производиться функцией advance(), поскольку двунаправленные итераторы не поддерживают оператор +;

О вместо алгоритма find() должна использоваться более эффективная функция find().

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

123456789 2 3 4 5 6 7 8 9 1 8 9 1 2 3 4 5 6 7 4 5 6 7 8 9 1 2 3



1 ... 118 119 120 [ 121 ] 122 123 124 ... 239

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