|
Программирование >> Операторы преобразования типа
Будьте внимательны и правильно передайте конец массива, как это сделано в нашем примере (со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) .ча помощь в реализации этого класса.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |