Программирование >>  Операторы преобразования типа 

1 ... 65 66 67 [ 68 ] 69 70 71 ... 239


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

Bestatter

undertaker

Deutschland

Germany

Haken

snag

Hund

Unternehrren

enterprise

arbeiten

work

deutsch

German

gehen

walk

unternehmen

undertake

arbeiten

work

Bestatter

undertaker

deutsch

German

Deutschland

Germany

gehen

walk

Haken

snag

Hund

Unternehmen

undertake

В первой части итоговых данных выводится содержимое первого контейнера, сравнивагон1его элементы оператором <. Сначала перечисляются все ключи, начинающиеся с символов верхнего регистра, а за ними следуют ключи, начи-наюнхисся с символов нижнего регистра.

Во второй части ключи сравниваются без учета регистра, поэтому порядок перечисления элементов изменяется. Обратите внимаюю - вторая часть содержит на одну строку меиыпе первой. Дело в том, что при сравнении без учета регистра слова Untemehmcn и unternehmen оказываются равными, а критерий сортировки нашего отображения не допускает наличия дубликатов. К сожалению, в результате возникает путаница - гстючу, которому должно соответствовать значение enterpriser, соответствует значение undertake . Вероятно, в этом примере было бы правильнее использовать мультиотображение. Обычно в качестве словарей применяется именно этот тип коитейпера.

Другие контейнеры STL

Библиотека STL - это архитектура, а не набор классов. Кроме стандартных контейнерных классов она позволяет работать с другими структурами данных. Вместо контейнеров STL программист может попользовать строки или обычные массивы или же написать собственный контейнер для особых целей. При этом он по-прежпему может применять алгоритмы (например, сортировки или слияния) для своего типа контейнера. Подобная архитектура является хорошим

В немецком языке существительные начинаются с прописной, а глаголы - со строчной букБы.



Автор Бпервые услышал о принципе открытой закрытости* от Роберта К. Мартина (Robert С. Martin), который, в свою очередь, узнал о нем от Бертрана Мейера (Bertrand Meyer).

примером - принципа открытой закрытости : библиотека открыта для расширения, но закрыта для модификации.

Существуют три подхода к созданию ЗТЪ-совместимых?> контейнеров:

О Активный подход. Программист реализует интерфейс, обязательный для контейнеров STL. В частности, он должен реализовать обычные функции контейнеров вроде begin() и end(). Такой подход называется активным, поскольку требует, чтобы контейнер был написан по определенным правилам.

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

О Интерфейсные классы. Программист объединяет два предыдущих подхода и пишет интерфейсный класс, который инкапсулирует реальную структуру данных в интерфейсе, отвечающем требованиям к контейнерам STL.

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

При написании собственного контейнера STL также можно обеспечить поддержку его параметризации для разных распределителей памяти. Стандартная библиотека С++ содержит набор специальных функций и классов для программирования с распределителями и неинициализированной памятью. За дополни-телыюй информацией обращайтесь па с. 702.

Строки как контейнеры STL

Строковые классы стандартной библиотеки С++ являют собой пример активного подхода к написанию контейнеров STL (строковые классы рассматриваются в главе И). Строку можно рассматривать как контейнер для хранения символов. Символы строки образуют последовательность; перебирая элементы этой последовательности, можно получить доступ к отдельным символам. Таким образом, стандартные строковые классы поддерживают интерфейс контейнеров STL. В них определены функции begin() и end(), возвращающие итераторы прямого доступа для перебора символов строки, и функции для итераторов и нтераторных адаптеров (например, функция push back() для вставки элементов с конца).

Учтите, что работа со строками в контексте STL выглядит несколько необычно. Дело в том, что обычно строка обрабатывается как единое целое (при передаче, копировании и присваивании используются целые строки, а не составляющие их символы). Но при работе со строкой на уровне отдельных символов (напри-



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

Различные аспекты использования строк в STL с примерами будут рассмотрены в главе, посвященной строкам (см. с. 480).

Обычные массивы как контейнеры STL

Обычные массивы могут использоваться как контейнеры STL Однако обычный массив не является классом, поэтому он не содержит функций begin() и end() и для него невозможно определять функции. В таких случаях приходится использовать либо пассивный подход, либо интерфейсные классы.

Непосредственное использование обычного массива

Вариант с иассивным подходом реализуется просто. Вам понадобятся лищь объекты, обеспечивающие перебор элементов массива через интерфейс итераторов STL. И такие итераторы уже существуют - это обычные указатели. При проектировании STL было решено использовать для итераторов интерфейс указателей, потому что в этом случае обычные указатели превращаются в итераторы. Здесь в очередной раз проявляется общая концепция чистой абстракции: любой объект, который ведет себя как итератор, является итератором (слг. с. 261). Пример использования обычного массива как контейнера STL:

cont/arrayl.срр #1nclude <iostream> Iinclude <algor1th[n> Iinclude <funct1onal> using namespace std:

Int maInC) {

int coll[] = { 5. 6. 2. 4. 1. 3 ):

Возведение элементов в квадрат

transform Ccoll, соН+б. Первый источник

coll. Второй источник

col 1. Приемник

multiplies<int>()): Операция

Сортировка выполняется, начиная со второго элемента sort Ссо11+1. со11+б);

Вывод всех элементов сору Ccoll. coll+6.

ostream iterator<int>(cout. )): cout endl:



1 ... 65 66 67 [ 68 ] 69 70 71 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика