Анимация
JavaScript


Главная  Библионтека 

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

Поиск двух смежных элементов с равными значениями

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 Cint 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 backCO)

PRINTJLEMENTS(coll ."coll : ");

Поиск первых двух злементов с одинаковыми значениями

vector<1nt>::iterator pos;

pos = adjacent find (coll.beginO. coll.endO):



if Cpos != coll .endO) {

cout « "first two elements with equal value have position « distanceCcoll .beginO.pos) + 1 « endl:

Поиск первых двух элементов, для которых значение второго вдвое превышает эначение первого

pos = adjacent find Ccoll.beginO, coll.endO. Интервал

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, содержит достаточное количество элементов.



О Для выявления различий в случае несовпадения интервалов следует использовать алгоритм mismatchO (см. с. 354).

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

Следующий пример демонстрирует использование обеих форм алгоритма equal(). Первый вызов проверяет равенство злементов в двух интервалах, а второй вызов при помощи вспомогательной предикатной функции проверяет совпадение соответствующих элементов двух коллекций по четности/нечетности.

algo/equall.срр include "algostuff,hpp" using namespace std;

bool bothEvenOrOdd Cint elemi. int elem2)

return elemi 2 == elem2 2;

int mainO {

vector<int> colli; list<1nt> C0112:

INSERT ELEMENTSCcol 11.1.7); lNSERT ELEMENTSCcoll2,3.9):

PRINTJLEMENTSCCol 11. "col 11; "); PRINTJLEMENTS(col 12. "col 12: ");

Проверка равенства двух коллекций

If (equal (colU.beginO. colli.endO. Первый интервал coll2.beginO)) { Второй интервал

cout « "colli == col 12" « endl:

else {

cout « "colli != coll2" « endl;

Проверка соответствия четности/нечетности элементов if (equal (colU.beginO. colli,endO. Первый интервал C0112.beginO. Второй интервал

bothEvenOrOdd)) { Критерий сравнения

cout « "even and odd elements correspond" « endl;

else {

cout « "even and odd elements do not correspond" « 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