|
Программирование >> Операторы преобразования типа
Чтобы иметь возможность свободно менять типы контейнера и итератора, используйте функцию advance() вместо оператора +=. Однако следует помнить, что при этом возможно непредвиденное снижение быстродействия при переходе на другие типы контейнеров, не поддерживающие итераторы произвольного доступа (именно из-за снижения быстродействия оператор += применяется только для итераторов произвольного доступа). Также помните, что функция advance() не возвращает значения, а оператор += возвращает новую позицию и может входить в более сложное выражение. Пример использования функции advance(): iter/advancel.cpp #include <lostream> #lnclude <l1st> #lnclude <algorithfii> using namespace std; int mainC) { list<int> coll; Вставка элементов от 1 до 9 for Cmt 1=1; i<-9; ++1) { coll.push backC1): list<int>::Iterator pos = coll .beginO; Вывод текущего элемента cout *pos endl; Перемещение вперед на три элемента advance Cpos. 3); Вывод текущего элемента cout *pos endl; Перемещение назад на один элемент advance Cpos. -1); Вывод текущего элемента cout *pos endl; Вызовы advanceO переводят итератор на три элемента вперед и на один элемент назад. Результат: 1 4 3 Существуют и другие применения функции advance(). Например, вы можете проигнорировать часть ввода от итераторов, читающих данные из входного потока, пример приведен на с. 286. Cm. c. 287 - Примеч. перев. Обработка расстояния между итераторами функцией distance Функция distanceO вычисляет разность между двумя итераторами: #inclucle <iterator> Dist distance (Inputlterator posl. Inputlterator po52) О Возвращает расстояние между итераторами ввода posl и pos2, О Оба итератора должны ссылаться на элементы одного контейнера. О Если итераторы не являются итераторами произвольного доступа, итератор pos2 должен быть доступен от posl (то есть должен находиться в той же или в одной из следующих позиций). О Тип возвращаемого значения Dist определяет тин разности в соответствии с Типом итераторов: iterator tra1ts<InputIterator>:;dlfference type Подробности приведены на с. 288. При помощи итераторных тегов* функция dlstance() выбирает оптимальную реализацию в соответствии с категорией итератора. Для итераторов произвольного доступа она просто возвращает pos2-posl; следовательно, для таких итераторов функция distanceO имеет постоянную сложность. Для остальных категорий итераторов функция distanceO последовательно увеличивает p05f до достижения pos2, после чего возвращается количество увеличений. В этом случае функция работает с линейной слож1ЮСтью, и для таких категорий итераторов лучше воздержаться от ее использования. Таким образом, функция distanceO обладает низким быстродействием для всех итераторов, кроме итераторов произвольного доступа. Реализация функции distanceO представлена на с. 289. Ниже приведен пример ее использования. iter/distance.срр #include <iostream> #include <llst> #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.beginC). coll.endC). Интервал 5); Значение If (pos != coll .endO) { Вычисление и вывод расстояния от начала коллекции cout difference between beginning and 5: dlstance(coll .beginO.pos) endl; else { cout 5 not found endl; Функция find() присваивает итератору pos позицию элемента со значением 5. Функция distanceO использует эту позицию для вычисления разгюстн между позицией и началом коллекции. Результат выполиеиия программы выглядит так: difference between beginning and 5: 8 Чтобы иметь возможность свободно менять тип контейнера и итератора, используйте функцию distanceO вместо оператора Однако следует помнить, что переход от итераторов произвольного доступа на другие итераторы ухудп1ает быстродействие. При вычислении разности между двумя итераторами, ие являющимися итераторами произвольного доступа, необходима осторожность. Первый итератор доллсеп ссылаться на элемент, предпхествуюищй второму или совпадающий с ним. В противном случае попытка вычисления разности неизбежно приводит к непредсказуемым последствиям. Другие аспекты этой проблемы затрагиваются в комментариях по поводу поиска в подмножестве (см. с. 111). В первых версиях STL использовалась другая сигнатура функции distance(). Вместо того Ч1обы возвращать разность, функция передавала ее в третьем аргументе. Эта версия была крайне неудобной, поскольку не позволяла напрямую вызывать функцию в выражениях. Если у пас устаревшая версия, воспользуйтесь простым обходным решением: iter/dlstance.hpp template <class Iterator> inline long distance (Iterator posl. Iterator pos2) long d = 0; distance (posl. pos2, d); return d: В этой функции тип возвращаемого значения не зависит от реализации, а жестко кодируется в виде типа long. В общем случае типа long должно хватать для всех возможных значений, но зто не гарантируется.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |