Анимация
JavaScript
|
Главная Библионтека Поиск первого элемента, большего 3 pes = findjf (coll.beginO. 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 " « distance(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 ma1n() { deque<int> 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 { cout « "no four consecutive elements with value > 3 found" « endl; Результат выполнения программы: 1 2 3 4 5 6 7 8 9 no four consecutive elements with value 3 found four consecutive elements with value > 3 start with 4. element При использовании второй формы алгоритма search n() возникает весьма неприятная проблема. Рассмотрим второй вызов search n(): pos = search n (coll.beginO. coll.endO. Интервал 4. Счетчик 3. Значение greater<int>()); Критерий Такая семантика поиска элементов, удовлетво1ояющих заданному критерию, отличается от той, что используется в других компонентах STL. По канонам STL этот вызов должен выглядеть так: pos = search n 1f (coll.beginO. coll.endO. Интервал 4. Счетчик bind2nd(greater<int>().3)): Критерий К сожалению, никто не заметил этой непоследовательности при включении новых алгоритмов в стандарт (они пе входили в исходную версию STL). Некоторые даже полагают, что версия с четырьмя аргументами более удобна, однако она требует бинарного предиката даже в том случае, когда по логике должно быть достаточно унарного предиката. Например, конструкция с пользовательской унарной предикатной функцией обычно выглядит так: bool IsPrime (int elem); pos = search njf (coll.beginO. coll.endO, Интервал 4. Счетчик isPrime): Критерий Однако на практике алгоритм требует, чтобы вы использовали бинарный предикат. Из-за этого приходится либо менять сигнатуру функции, либо писать функцию-оболочку: bool binarylsPrime (int eleml. 1nt) { return isPrlme(eleml); pos = search n (coll.beginO. coll.endO. Интервал 4. Счетчик 0. Фиктивное значение binarylsPrime): Бинарный критери1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 [ 108 ] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |