Примеры использования тегов итераторов
Примеры использования тегов итераторов
Для всех типов обычных указателей мы можем определить value_type и distance_type с помощью следующего:
template ‹class T›
inline T* value_type(const T*) {return (T*)(0);}
template ‹class T›
inline ptrdiff_t* distance_type(const T*) {return (ptrdiff_t*)(0);}
Тогда, если мы хотим осуществить обобщённую функцию reverse, мы пишем следующее:
template ‹class BidirectionalIterator›
inline void reverse(BidirectionalIterator first, BidirectionalIterator last) {
_reverse(first, last, value_type(first), distance_type(first));
}
где _reverse определена следующим образом:
template ‹class BidirectionalIterator, class T, class Distance›
void _reverse(BidirectionalIterator first, BidirectionalIterator last, T*, Distance*) {
Distance n;
distance(first, last, n); // смотри раздел "Операции с итераторами"
--n;
while (n › 0) {
T tmp = *first;
*first++ = *--last;
*last = tmp;
n -= 2;
}
}
Если имеется дополнительный тип указателя _huge такой, что разность двух указателей _huge имеет тип long long, мы определяем:
template ‹class T›
inline T* value_type(const T _huge *) {return (T*) (0);}
template ‹class T›
inline long long* distance_type(const T _huge *) {
return (long long*)(0);
}
Часто желательно для шаблонной функции выяснить, какова наиболее специфичная категория её итераторного аргумента, так чтобы функция могла выбирать наиболее эффективный алгоритм во время компиляции. Чтобы облегчить это, библиотека вводит классы тегов категорий (category tag), которые используются как теги времени компиляции для выбора алгоритма. Это следущие теги: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag и random_access_iterator_tag. Каждый итератор i должен иметь выражение iterator_category(i), определённое для него, которое возвращает тег наиболее специфичной категории, который описывает его поведение. Например, мы определяем, что все типы указателей находятся в категории итераторов произвольного доступа:
template ‹class T›
inline random_access_iterator_tag iterator_category(const T*) {
return random_access_iterator_tag();
}
Определяемый пользователем итератор BinaryTreeIterator может быть включен в категорию двунаправленных итераторов следующим образом:
template ‹class T›
inline bidirectional_iterator_tag iterator_category(const BinaryTreeIterator‹T›&) {
return bidirectional_iterator_tag();
}
Если шаблонная функция evolve хорошо определена для двунаправленных итераторов, но может быть осуществлена более эффективно для итераторов произвольного доступа, тогда реализация выглядит так:
template ‹class BidirectionalIterator›
inline void evolve(BidirectionalIterator first, BidirectionalIterator last) {
evolve(first, last, iterator_category(first));
}
template ‹class BidirectionalIterator›
void evolve(BidirectionalIterator first, BidirectionalIterator last, bidirectional_iterator_tag) {
//… более универсальный, но менее эффективный алгоритм
}
template ‹class RandomAccessIterator›
void evolve(RandomAccessIterator first, RandomAccessIterator last, random_access_iterator_tag) {
//… более эффективный, но менее универсальный алгоритм
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
16.3. Примеры использования termios
16.3. Примеры использования termios 16.3.1. Пароли Самой распространенной причиной модификации установок termios является чтение пароля без эхо-контроля символов. Для этого следует отключить локальное эхо во время чтения пароля. Ваш код должен выглядеть следующим образом:struct termios
Примеры использования ADODB
Примеры использования ADODB Для создания примеров работы с IBProvider через ADODB был применен Visual Basic for Application (VBA) из Microsoft Excel 97. Для использования ADODB-компонентов нужно их добавить в список библиотек, употребляемых Visual Basic Для этого:* Откройте редактор кода Visual Basic (Alt+Fl 1).* Выберите
Примеры использования библиотеки классов
Примеры использования библиотеки классов Для написания и тестирования примеров использовался Borland C++ Builder 3-й версии (с установленным пакетом исправлений, который доступен для скачивания на сайте компании Borland). Библиотека классов самостоятельно конфигурируется под
1.2. Примеры использования Windows API
1.2. Примеры использования Windows API В этом разделе разобраны простые примеры, находящиеся на компакт-диске. Все эти примеры уже упоминались ранее, и каждый из них иллюстрирует какую-то отдельно взятую возможность API. Более сложным обобщающим примерам, которые задействуют
Фильтры и примеры их использования
Фильтры и примеры их использования Фильтры – удобное средство поиска и отображения нужных данных в таблице Excel. Используя фильтры, вы можете отобразить в таблице только те данные, которые вам нужны в данный момент. Например, если вы работаете с определенной группой
Примеры использования
Примеры использования Следующий оператор возвращает время сервера в момент, когда сервер обслуживает запрос клиента Firebird:SELECT CURRENT_TIME AS TIME_FINISHED FROM RDB$DATABASE;В следующем операторе добавления идентификатор текущей транзакции, текущие серверные дата и время, а также имя
5.11.3. Примеры использования команды mount
5.11.3. Примеры использования команды mount Теперь, когда мы знаем номер раздела, можно его подмонтировать. В общем случае сначала командой mkdir создается точка монтирования (каталог, куда будет монтироваться раздел): sudo mkdir <точка монтирования> Затем к этой точке командой mount
ГЛАВА 7: ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ СИСТЕМ
ГЛАВА 7: ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ СИСТЕМ Далее я привожу лучшие, на мой взгляд, системы, которые наиболее полно отражают системный подход к управлению делами.СИСТЕМА БЛОГГЕРА ДАРРЕНА КРОУФОРДАЯ искал несколько дней простой способ интегрировать Evernote с моей системой GTD. Я
Примеры использования
Примеры использования Объенение всех файлов, расположенных в заданной директории Задача: объединить три файла: 1.txt, 2.txt, 3.txt.1. Сделайте новую директорию (скажем, files) и скопируйте в нее 1.txt, 2.txt, 3.txt;2. Выберите «txt» в «file type»;3. Нажмите «path» и выберите директорию files;4. Нажмите
1.4.2. Примеры использования команды chmod
1.4.2. Примеры использования команды chmod Рассмотрим несколько примеров изменения режима доступа к файлу с помощью команды chmod. Предполагается, что строка режима для нашего файла имеет такой вид: rwxrwxrwx. Команда Строка режима Результат chmod a?x myfile rw?rw?rw- Отмена всех разрешений
1.4.4. Дополнительные примеры использования команды chmod
1.4.4. Дополнительные примеры использования команды chmod Ниже приведен ряд Примеров, иллюстрирующих применение команды chmod в абсолютном режиме: Команда Строка режима Результат chmod 666 rw?rw?rw- Установка разрешений на чтение и запись для владельца, группы и других
8.4. Дополнительные примеры использования команды grep
8.4. Дополнительные примеры использования команды grep В следующих примерах команда grep принимает по каналу результаты работы других команд, фильтруя их надлежащим
10.16. Дополнительные примеры использования редактора sed
10.16. Дополнительные примеры использования редактора sed Выше были описаны основные команды sed. Далее мы рассмотрим ряд практических примеров применения редактора