|
Программирование >> Операторы преобразования типа
Пример использования алгоритма find first of(): algo/findofl.cpp #include algostuff.hpp using namespace std: Int mainC) { vector<int> col 1: list<lnt> searchcoll: INSERT ELEMENTS(coll.1.11): INSERT ELEMENTS(searchcoll.3.5): PRiNTJLEMENTSCcoll, coll: ): PRINTJLEMENTSCsearchcoll . searchcoll: ); Поиск в coll первого вхождения элемента из searchcoll vector<int>;;iterator pos; pos = findJ1rst of Ccoll .beginC). coll.endC). Интервал searchcoll,beginC). Начало искомых значений searchcoll.endO): Конец искомых значений cout first element of searchcoll in coll is element distanceCcoll .beginO.pos) + 1 endl: Поиск в coll последнего вхождения search элемента из searchcoll vector<i nt>::reverse 1terator rpos: rpos = findJirst of (coll .rbeginC). coll.rendO. Интервал searchcol1.beginC). Начало искомых значений searchcoll .endO): Конец искомых значений cout last element of searchcoll in coll is element distanceCcoll.beginC).rpos.baseO) endl; Второй вызов использует обратные итераторы для поиска последнего элемента со значением, равным значению одного из элементов searchcolL При выводе позиции элемента вызывается функция base(), которая преобразует обратный итератор в обычный (чтобы позиция отсчитывалась от начала коллекции). Обычно к результату distanceO прибавляется 1, так как для первого элемента расстояние равно О, однако base() смещает логическую позицию, на которую ссылается итератор, что приводит к желаемому эффекту (функция base() описана на с. 274). Программа выводит следующий результат: coll: 1 2 3 4 5 6 7 8 9 10 11 searchcoll: 3 4 5 first element of searchcoll in coll is element 3 last element of searchcoll in coll is element 5 Поиск двух смежных элементов с равными значениями Inputlterator adjacent find (Inputlterator beg. Inputlterator end) Inputlterator adjacent f1nd (Inputlterator beg. Inputlterator end. BinaryPredicate op) О Первая форма возвращает позицию первого элемента со значением следующего элемента. О Вторая форма возвращает позицию первого элемента в интервале [beg,end), для которого предикат op{elem,nextElem) возвращает true. О Если подходящий элемент не найден, обе формы возвращают end. О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Предикат ор не должен изменять передаваемые аргументы. О Сложность линейная (не более numberOfElements сравнений или вызовов ор соответственно). Следующая программа демонстрирует обе формы алгоритма adjacent find(): algo/adjfindl.cpp #1nc1ude algostuff.hpp using namespace std; Функция проверяет, что значение следующего объекта вдвое больше значения предыдущего bool doubled (int elemi. int elem2) return elemi * 2 == elem2; int mainO vector<int> col 1; coll.push back(l) coll.push back(3) coll.push back(2) col 1.push back(4) coll.push back(5) coll.push back(5) col 1.push back(0) PRINTJLEMENTS(coll . coll : ); Поиск первых двух элементов с одинаковыми значениями vector<1nt>::iterator pos: pos = adjacent find (coll.beginO. coll.endO): 352 Глава 9. Алгоритмьр STL if Cpos != coll .endO) { cout first two elements with equal value have position distanceCcoll .beginO.pos) + 1 endl: Поиск первых двух элементов, для которых значение второго вдвое превышает эначение первого pos = adjacent find Ccoll.beginO, coll.endC). Интервал doubled); Критерий if Cpos != coll .endO) { cout first two elements with second value twice the first have pos. distanceCcoll.beginO.pos) + 1 endl: Первый вызов adjacent find() ищет элементы с одинаковыми значениями. Вторая форма при помощи функции doubled() проверяет, что значение второго элемента вдвое больше значения первого. Программа выводит следующий результат: coll: 13 2 4 5 5 0 first two elements with equal value have position 5 first two elements with second value twice the first have pos. 3 Сравнение интервалов Проверка на равенство bool equal СInputlteratorl beg. Inputlteratorl end. InputIterator2 cmpBeg) bool equal (Inputlteratorl йед. Inputlteratorl епб/, InputIterator2 cmpBeg. BinaryPredicate op) О Первая форма проверяет полное совпадение элементов интервалов [beg,end) и [anpBeg,...) и возвращает результат в виде логической величины. О Вторая форма проверяет, что каждый вызов бинарнорю предиката ор(е1ет, cmpElem) для соответствующих элементов интервалов lbeg,end) и [cmpBeg,...) возвращает true. О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Предикат ор не должен изменять передаваемые аргументы. О Перед вызовом необходимо убедиться в том, что интервал, начинающийся с cmpBeg, содержит достаточное количество элементов.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |