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

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


Будьте внимательны и правильно передайте конец массива, как это сделано в нашем примере (со11+6). Как обычно, конец интервала находится в позиции за последним элементом.

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

25 1 4 9 16 36

Дополнительные примеры приведены на с. 372 и 411.

Интерфейсный класс для массива

в своей книге The С++ Programming Languages, 3rd Edition, Бьярн Страуструп описьшает очень полезный интерфейсный класс для обычных массивов. Он гораздо надежнее обычных массивов, хотя и не уступает им по быстродействию. Наконец, оп является хорошим примером контейнера STL, определяемого пользователем. В данном случае используется вариант с интерфейсным классом, то есть стандартный контейнерный интерфейс реализуется как оболочка вокруг массива. Определение класса саггау (сокрашенное от С аггау или constant size аггау ) выглядит так:

cont/carray.hpp #1nclude <c5tddef>

tempiate<class T. std::s1ze t thes1ze> class carray { private:

T v[thes1ze]: Массив фиксированного размера

для злементов типа Т

public: Определения типов typedef Т value type;

typedef Т* iterator;

typedef const Т* const iterator; typedef T& reference:

typedef const T& const reference: typedef std;;size t size type; typedef std::ptrd1ff t difference type;

Поддержка итераторов Iterator beginC) { return v; } constjterator beginC) const { return v; ) iterator endC) { return v+thesize; ) const iterator endC) const { return v+thes1ze: )

Прямой доступ к элементам

reference operator[](std::size t 1) { return v[i]: } con5t reference operator[](5td:;size t 1) const { return v[1]: }

Исходный интерфейсный класс Бьярна Страуструпа называется с аггау, а его определение приБвдено в разделе 17.5.4 книги Страуструпа. В данном случае в интерфейсный класс внесены небольшие изменения.



Фиксированный размер

5lze type 5lze() const { return thesize: )

s1ze type [nax s1zeC) const { return thesize; )

Преобразование к обычному массиву Т* as array() { return v; }

Пример использования класса саггау:

cont/carrayl.cpp Iinclude <algorithin> Iinclude <functional> Iinclude carray,hpp Iinclude print,hpp using namespace std:

int mainC) {

carray<int.lO> a;

for (unsigned i=0: i<a.size(): ++i) { a[i] = 1+1:

PRINT ELEMENTS(a):

reverseCa.beginO ,a.endO): PRINT ELEMENTS(a);

transform(a.begin().a.end(). Источник

a.beginO. Приемник

negate<int>()); Операция

PRINT ELEMENTS(a):

Как видно из приведенного кода, прямое взаимодействие с контейнером осуществляется через операции общего контейнериого интерфейса (функции begin(), end() и оператор []). Следовательно, в вашем распоряжении также оказываются различные операции, вызывающие функции begin() и end(), - такие, как алгоритмы и вспомогательная функция PRINT ELEMENTS(), представленная на с. 128.

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

123456789 10 10 987654321 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Хэш-таблицы

в стандартную библиотеку С++ не вошла такая важная структура данных, как хэш-таблица. Предложения о включении хэш-таблиц в стандарт были, однако хэш-таблицы не входили в исходную версию STL, и комитет решил, что предло-



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

В сообществе С++ существует несколько распространенных реализаций С++. В библиотеках обычно определяются четыре разновидности хэш-таблиц: hash set, hash multiset, hash map и hash multimap. По аналогии со стандартными ассоциативными контейнерами multi-версии допускают присутствие дубликатов, а таблицы hash map и hash multimap содержат пары ключ/значение . Бьярн Страуструп подробно рассматривает хэш-таблицы hash map как пример вспомогательного контейнера STL в разделе 17.6 своей книги The С++ Programming Languages, 3rd Edition. Примеры конкретной реализации хэш-контейнеров можно найти, например, в версии STLport (http: www.stlport.org/). Учтите, что разные реализации мотзо- расходиться в деталях, поскольку хэш-контейнеры еще не стандартизированы.

Реализация ссылочной семантики

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

cont/countptr.hpp #1fndef COUNTED PTR HPP fdefine COUNTED PTR HPP

/* Класс, обеспечивающий семантику подсчета ссылок

* - объект, на который ссылается указатель, автоматически

* уничтожается при удалении последнего экземпляра CountedPtr

* для данного объекта. */

template <class Т> class CountedPtr { private:

Т* ptr: Указатепь на значение

long* count; Количество владельцев (общие данные)

Больпюе спасибо Грегу Колиину (Greg Colvin) и Биману Доуэсу (Вешап Dowes) .ча помощь в реализации этого класса.



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

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