Анимация
JavaScript
|
Главная Библионтека ментов (неупорядоченное). Алгоритм nth element() разделяет элементы на два подмножества в соответствии с критерием сортировки. Впрочем, задача также может быть решена алгоритмами partition() и stable partition(). Различия между этими алгоритмами заключаются в следующем. О Алгоритму nth element() передается требуемое количество элементов в первой части (а следовательно, и во второй). Пример: Перемещение четырех наименьших элементов в начало nthelement (coll.beginO. Начало интервала coll .beg1nO+3. Позиция, отделяющая первую часть от второй coll.endO): Конец интервала Но после вызова невозможно сказать, по какому критерию первая часть отличается от второй. Более того, в обеих частях могут присутствовать .элементы, совпадающие по значению с п-м элементом. О Алгоритму partitionO передается конкретный критерий сортировки, определяющий различия между первой и второй частями: Перемещение всех элементов, меньших 7. в начало vector<int>::iterator pos: pos = partition (colli.beginO. colli.endO. Интервал b1nd2nd(less<lnt>().7)): Критерий Ha этот раз после вызова невозможно сказать, сколько элементов входит в первую и вторую части. Возвращаемый итератор pos указывает на первый элемент второй части, которая содержит все элементы, не соответствующие кррггерию. О Алгоритм stable partition() в целом аналогичен partition(), но он дополнительно гарантирует сохранение порядка следования элементов в обеих частях по отношению к другим элементам, входящим в ту же часть. Любому алгоритму сортировки в необязательном аргументе всегда можно передавать критерий сортировки. По умолчанию критерием сортировки является объект функции lesso, а элементы сортируются по возрастанию значений. Как и в случае с модифицирующими алгоритмами, приемником алгоритмов сортировки не может быть ассоциативный контейнер, поскольку элементы ассоциативного контейнера считаются константными. Кроме того, алгоритмы сортировки не могут вызываться для списков, поскольку списки не поддерживают итераторы произвольного доступа. Впрочем, для сортировки элементов в списках определена функция sort() (см. с. 252). Алгоритмы упорядоченных интервалов Алгоритмы упорядоченных интервалов требуют, чтобы интервалы, с которыми они работают, были изначально упорядочены по соответствующему критерию. В табл. 9.7 перечислены все алгоритмы стандартной библиотеки С++, предназначенные для упорядоченных интервалов. Достоинством этих алгоритмов является невысокая сложность. Таблица 9.7. Алгоритмы упорядоченных интервалов Название Описание Страница b[nary search() includesO lower bound() upper bound() . equaLrangeO mergeO set union() setJntersectionO set difference() set sym m etric d iff erenceO inplace mergeO Проверяет, содержит ли интервал заданный элемент 400 Проверяет, что каждый элемент интервала также 401 является элементом другого интервала Находит первый элемент со значением, большим 402 либо равным заданному Находит первый элемент со значением, большим 402 заданного Возвращает количество злементов в интервале, 404 равных заданному значению Выполняет слияние элементов двух интервалов 406 Вычисляет упорядоченное объединение двух 407 интервалов Вычисляет упорядоченное пересечение двух 408 интервалов Вычисляет упорядоченный интервал, который 409 содержит все элементы интервала, не входящие в другой интервал Вычисляет упорядоченный интервал, содержащий 410 все элементы, входящие только в один из двух интервалов Выполняет слияние двух последовательных 413 упорядоченных интервалов Первые пять алгоритмов упорядоченных интервалов, перечисленные в таблице, являются немодифицирующими, поскольку они ограничиваются поиском по заданному условию. Другие алгоритмы комбинируют два упорядоченных входных интервала и записывают результат в приемный интервал. Как правило, результат выполнения алгоритмов тоже упорядочен. Численные алгоритмы Численные алгоритмы выполняют разнообразную обработку числовых элементов. В табл. 9.8 приведен список численных алгоритмов стандартной библиотеки С++. Имена алгоритмов дают некоторое представление о том, что они делают, однако эти алгоритмы отличаются большей гибкостью и мощью, чем может показаться на первый взгляд. Например, алгоритм accumulate() по умолчанию вычисляет сумму элементов. Если элементами являются строки, то вычисляется их конкатенация. А если переключиться с оператора + на оператор *, алгоритм вычислит произведение элементов. Алгоритмы accumulateO и inner prcduct() вычисляют и возвращают сводное значение без модификации интервалов. Другие алгоритмы записывают свои результаты в приемный интервал, количество элементов в котором соответствует количеству элементов в исходном интервале.
Вспомогательные функции В оставшейся части этой главы приводятся подробные описания всех алгоритмов. Для каждого алгоритма дается минимум один пример. Следующие вспомогательные функции упрощают код примеров, чтобы читатель мог сосредоточиться на наиболее содержательных аспектах: algo/algostuff,hpp #Tfndef ALGOSTUFF HPP fdefine ALGOSTUFF HPP finclude <iostream> finclude <vector> fmclude <deque> #1nclude <llst> #1nclude <set> include <map> #1nclude <string> #1nclude <algorithni> finclude <functional> #1nclude <numer1c> /* PRINTJLEMENTSO * - вывод необязательной строки С. за которой выводятся * - все элементы коллекции coll. разделенные пробелами. */ template <cla5s Т> inline void PRINTJLEMENTS (const T& coll, const char* optC5tr="") { typename T::const 1terator pos: std::cout « optcstr: for (pos-col1.beginO: po5!=coll,end(): ++pos) { std::cout « *pos « ; std::cout « std::endl; 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 |