Анимация
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

Cm. c. 287 - Примеч. перев.

Обработка расстояния между итераторами функцией distance

Функция distanceO вычисляет разность между двумя итераторами: #inclucle <iterator>

Dist distance (Inputlterator posl. Inputlterator po52)

О Возвращает расстояние между итераторами вводд posl и pos2,

О Оба итератора должны ссылаться на элементы одного контейнера.

О Если итераторы не являются итераторами произвольного доступа, итератор pos2 должен быть доступен от posl (то есть должен находиться в той же или в одной из следующих позиций).

О Тип возвращаемого значения Dist определяет тип разности в соответствии с Типом итераторов:

iterator traits<InputIterator>:;difference type Подробности приведены на с. 288.

При помощи итераторных тегов* функция dlstance() выбирает оптимальную реализацию в соответствии с категорией итератора. Для итераторов произвольного доступа она просто возвращает pos2-posl; следовательно, для таких итераторов функция distanceO имеет постоянную сложность. Для остальных категорий итераторов функция distanceO последовательно увеличивает p05f до достижения pos2, после чего возвращается количество увеличений. В этом случае функция работает с линейной слож1ЮСтью, и для таких категорий итераторов лучше воздержаться от ее использования. Таким образом, функция distanceO обладает низким быстродействием для всех итераторов, кроме итераторов произвольного доступа.

Реализация функции distanceO представлена на с. 289. Ниже приведен пример ее использования.

iter/distance.срр #include <iostream> #include <list> #include <algorithni> using namespace std:

int mainO {

list<int> coll;

Вставка эленентов от -3 до 9 for (int i=-3: i<=9: ++i) { coll.push back(i);



Поиск элемента со значением 5 llst<int>:-.iterator pos;

pos = find (coll .begmC). coll.endO. Интервал 5); Значение

1f (pos != coll .endO) {

Вычисление и вывод расстояния от начала коллекции cout « "difference between beginning and 5: " « dlstance(coll .beginO .pes) « endl;

else {

cout « "5 not found" « endl;

Функция find() присваивает итератору pos позицию элемента со значением 5. Функция distanceO использует эту позицию для вычисления разгюсти между позицией и началом коллекции. Результат выполнения программы выглядит так:

difference between beginning and 5; 8

Чтобы иметь возможность свободно менять тип контейнера и итератора, используйте функцию distanceO вместо оператора Однако следует помнить, что переход от итераторов произвольного доступа на другрю итераторы ухудшает быстродействие.

При вычислении разности между двумя итераторами, не являющимися итераторами произвольного доступа, необходима осторожность. Первый итератор доллсен ссылаться на элемент, нредшествуюитй второму или совпадающий с ним. В противном случае попытка вычисления разности неизбежно приводит к непредсказуемым последствиям. Другие аспекты этой проблемы затрагиваются в комментариях но поводу поиска в подмножестве (см. с. 111).

В первых версиях STL использовалась другая сигнатура функции distance(). Вместо того Ч1обы возвращать разность, функция передавала ее в третьем аргументе. Эта версия была крайне неудобной, поскольку не позволяла напрямую вызывать функцрпо в выражениях. Если у пас устаревшая версия, воспользуйтесь простым обходным решением:

iter/distance.hpp template <class Iterator>

inline long distance (Iterator posl. Iterator pos2)

long d = 0;

distance (posl. pos2, d); return d;

В этой функции тип возвращаемого значения не зависит от реализации, а жестко кодируется в виде тина long. В обшем случае типа long должно хватать для всех возможных значений, но зто не гарантируется.



Перестановка элементов функцией iter swap

простая вспомогательная функция iter swap() меняет местами элементы, на которые ссылаются два итератора:

#1nclude <algor1thni>

void 1ter swap (Forwardlterator posi, Forwardlterator pos)

О Меняет местами элементы, на которые ссылаются итераторы posi и pos2.

О Итераторы не обязаны относиться к одному типу. Тем не менее значения должны быть совместимы по присваиванию.

Простой пример использования функц1П1 itjer swap() (функция PRINT ELEMENTS() представлена на с. 128):

1ter/swapl.cpp #include <1ostrea[ii> #include <list> #1nclude <algor1thni> #1nclude "print.hpp" using namespace std:

int mainO {

list<int> coll:

Вставка эленентов со значенияни от 1 до 9 for (int i=l: 1<=9: ++i) { coll.push back(i);

PRINT ELEMENTS(coll):

Перестановка первого и второго значений iter swap (coll.beginO. ++со11 .beginO):

PRINT ELEMENTS(coll):

Перестановка первого и последнего значений iter swap (coll.beginO. --coll.endO):

PRINT ELEMENTS(coll):

Результат выполнения программы выглядит так:

123456789 213456789 9 1 3 4 5 6 7 8 2

Учтите, что с векторами эта программа обычно не работает. Дело в том, что операции ++cotl.begin() и ~coll.end() выполняются с временными указателями (дополнительная информация на эту тему приведена на с. 264).



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