Анимация
JavaScript
|
Главная Библионтека О Оба алгоритма возвращают новый логический конец модифицированного интервала (то есть позицию за последним элементом, который не был удален). О Алгоритмы заменяют «удаленные» элементы следующими элементами, которые не были удалены. О Алгоритмы сохраняют порядок следования элементов, которые не были удалены. О Вызывающая сторона должна использовать новый логический конец интервала вместо исходного конца end (за дополнительной информацией обращайтесь на с, 122). О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Алгоритм remove if() обычно копирует унарный предикат внутри алгоритма и использует его дважды. Из-за этого могут возникнуть проблемы, если предикат изменяет свое состояние при вызове функции. За подробностями обращайтесь на с. 303. О Вследствие модификации эти алгоритмы не могут использоваться с ассоциативными контейнерами (см. с, 125), однако в классах ассоциативных контейнеров определена аналогичная функция erase() (см. с. 248). О Для списков определена аналогичная функция remove(), которая часто работает более эффективно, поскольку она меняет внутренние указатели вместо присваивания значений элементам (см. с. 247). О Сложность линейная {numberOfElements сравнений или вызовов ор соответственно). Пример использования алгоритмов remove() и removeJf(): algo/removel.cpp #inclLide "algostuff.hpp" using namespace std; int mainO ( vector<int> coll: INSERT ELEMENTS(coll.2.6) lNSERT ELEMENTS(coll.4.9) INSERT ELEMENTS(C0ll.l.7) PRiNTJLEMENTSCcoll, "coll: "); Удаление всех элементов со значением 5 vector<int>::iterator pos; pos = remove(coll .beginO . coll.endO. Интервал 5); Удаляемое значение PRiNTJLEMENTSCcoll ."size not changed: "); Стирание "удаленных" элементов из контейнера coll .eraseCpos. coll.endO): PRINTJLEMENTSCcoll/size changed: "); Удаление всех элементов со значением меньше 4 coll ,erase(remove if(coll,beginO. coll.endO, Интервал bind2nd(less<int>().4)). Критерий удаления coll .endO): PRINT ELEMENTS(coll,"<4 removed; "); Результат выполнения программы выглядит так: coll: 234564567891234567 size not changed: 234646789123467567 size changed: 234646789123467 <4 removed: 4646789467 Удаление злементов при копировании Outputlterator removejopy (Inputlterator sourceBeg. Inputlterator sourceEnd. Outputlteratir destBeg. const T& value) Outputlterator remove copy 1f (Inputlterator sourceBeg. Inputlterator sourceEnd. Outputlterator destBeg. UnaryPredicate op) О Алгоритм remove copy() является объединением алгоритмов сору() и remove(). Он удаляет из исходного интервала lbeg,end) все элементы, равные value, в процессе копирования элементов в приемный интервал, начинающийся с позиции destBeg. О Алгоритм remove copy if() является объединением алгоритмов сору() и remove if(). Он удаляет каждый элемент интервала [beg,end), для которого унарный предикат op(elem) возвращает true. Замена производится в процессе копирования элементов в приемный интервал, начинающийся с позиции destBeg. О Оба алгоритма возвращают позицию за последним скопированным элементом в приемном интервале (то есть позицию первого элемента, который не был заменен). О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Перед вызовом необходимо убедиться в том, что приемный интервал имеет достаточный размер, или использовать итераторы вставки. О Сложность линейная (numberOfElements сравнений или вызовов ор и присваиваний соответственно). Пример использования алгоритмов remove copy() и remove copy if(): algo/reniove2.cpp #1nclude "algostuff.hpp" using namespace std: int mainO { 11st<int> colli; INSERT ELEMENTS(colll.l.6); INSERT ELEMENTS(colll.l.9); PRiNTJLEMENTSCcoll 1); Вывод содержимого коллекции кроме элементов со значением 3 remove copy(colll.beginO . colli.endO. Источник ostream iterator<int>Ccout." "), Приемник 3): Удаляемое значение cout « endl; Вывод содержимого коллекции кроме элементов со значением, большим 4 remQve copy if(colll.beginO. colli.endC). Источник ostream iterator<int>(cout." "). Приемник bind2nd(greater<1nt>().4)); Критерий удаления cout « endl; Копирование всех элементов, больших 3. в мультимножество multiset<int> со112; remove copy ifCcolll.beginO. colli.endO. Источник inserter(coll2.coll2.end()). Приемник bind2nd(less<int>0.4)); Критерий удаления PRINT ELEMENTS(coll2); Результат выполнения программы выглядит так: 123456123456789 1245612456789 1 2 3 4 1 2 3 4 445566789 Удаление дубликатов Удаление смежных дубликатов Forwardlterator unique (Forwardlterator beg, Forwardlterator end) Forwardlterator unique (Forwardlterator beg. Forwardlterator end. BinaryPredicate op) 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 |