|
Программирование >> Операторы преобразования типа
* - со значением 4 (если он есть) */ I1st<int>: iterator pos2: 1f (posl != coll.endO) { pos2 = find (++posl. coll.endO. Интервал 4); Значение /* Вывод всех элементов от первого до второго элемента * со значением 4. включая оба элемента * - Итератор posl необходимо вернуть к позиции первого элемента * со значением 4 (если он есть) * - конец интервала определяется позицией эа вторым элементом * со значением 4 (если он есть) */ if (posl!=coll ,endO && pos2!-coll .endO) { copy (--posl. ++pos2. ostream 1terator<1nt>(cout. )): cout endl; Чтобы найти второй элемент со значением 4, необходимо увеличить позицию первого найденного элемента posl. Но следует помнить, что попытки выйти за конец коллекции приводят к непредсказуемым последствиям. Если вы не уверены в существовании элемента, перед увеличением проверьте значение, возвращаемое алгоритмом find(). Программа выводит следующий результат: coll: 123456789123456789 4567891234 Алгоритм find() может повторно вызываться для одного интервала с разными зпаченрптми. Тем не менее использование найденных позиций для определения интервалов требует осторожности, поскольку интервал может оказаться недействительным. Проблема действительности интервалов рассматривается на с. 109. В следующем примере алгоритм find if() используется для поиска элементов по совершенно иному критерию: algo/find2,cpp #include algostuff.hpp using namespace std; int main0 { vector<int> coll: vector<1nt>::iterator pos INSERT ELEMENTS(coll.l.9) PRINT ELEMENTS(coll. coll Поиск первого элемента, большего 3 pos = findjf (coll.beginC). coll.endO. Интервал bind2ndCgreater<int>().3)); Критерий Вывод позиции cout the distance(coll.begin().pos) + 1 element is the first greater than 3 endl; Поиск первого элемента, кратного 3 pos = find if (coll .beginO. coll.endO. notl(bind2nd(modulus<int>().3))): Вывод позиции cout the d1stance(coll .beginO ,pos) + 1 . element is the first divisible by 3 endl; При первом вызове find() простой объект функции в сочетании с адаптером bind2nd ищет первый элемент со значением, большим 3. При втором вызове передается более сложная комбинация для поиска первого элемента, делящегося на 3 без остатка. Программа выводит следующий результат; coll; 12 3 4 5 6 7 8 9 the 4. element is the first greater than 3 the 3. element is the first divisible by 3 Ha c. 131 приведен пример использования алгоритма find() для поиска первого простого числа. Поиск первых п последовательных совпадений Inputlterator search n (Inputlterator beg. Inputlterator end, Size count, const T& value) Inputlterator search n СInputlterator beg. Inputlterator end. Size count, const T8i value. BinaryPredicate op) О Первая форма возвращает позицию первого из count последовательных элементов в интервале [beg,end), каждый из которых имеет значение value. О Вторая форма возвращает позицию первого из count последовательных элементов в интервале [beg,end), для которых бинарный предикат op{elem,value) возвращает true. О Если подходящий элемент не найден, обе формы возвращают end. О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Предикат ор не должен изменять передаваемые аргументы. О Эти алгоритмы не входили в исходную версию STL, а при их включении была допущена определенная небрежность. Использование бинарного предиката во второй форме (вместо унарного предиката) нарушает логическую согласованность исходной версии STL (см. комментарий на с. 344). О Сложность линейная (не более numberOfElements>count сравнений или вызовов ор соответственно). Пример поиска трех последовательных элементов со значениями, большими либо равными 3: algo/searchnl.cpp #include algostuff.hpp using namespace std; int mainO { deque<1nt> coll: INSERTJLEMENTSCcoll ,1.9): PRINTJLEMENTSCcoll): Поиск четырех последоватепьных элементов со значением 3 deque<int>::iterator pos: pos = search n (coll.beginO. coll.endO. Интервал 4. Счетчик 3): Значение Вывод результата if (pos coll.endO) { cout four consecutive elements with value 3 start with distance(coll,beginO,pos) +1 . element endl: else { cout no four consecutive elements with value 3 found endl: Поиск четырех последовательных элементов со значением, большим 3 pos = search n (coll.beginO. coll.endO. Интервал 4. Счетчик 3. Значение greater<int>()): Критерий Вывод результата if (pos != coll .endO) { cout four consecutive elements with value > 3 start with distance(coll .beginO,pos) +1 , element endl; else {
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |