Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [ 70 ] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

Класс напоминает стандартный класс умного указателя auto ptr (см. с. 54). Предполагается, что значения, которыми инициализируются умные указатели, были возвращены оператором new. В отличие от класса auto ptr это позволяет копировать умные указатели так, чтобы оригинал и копня оставались действительными. Объект уничтожается только после удаления последнего указателя, ссылающегося на него.

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

Ниже приведен пример использования класса CountedPtr:

cont/refseml.cpp #1nclude <lostream> #include <l1st> finclude <deque> linclude <algorithm> linclude "countptr.hpp" using namespace std:

void prlntCountedPtr (CountedPtr<1nt> elem) {

cout « *elem « ;

1nt mainO (

Массив целых чисел (для совместного использования

в разных контейнерах)

static int values[] = { 3. 5, 9. 1, 6. 4 }:

Две разные коллекции typedef CountedPtr<1nt> IntPtr; deque<IntPtr> colli: list<IntPtr> С0112:

Вставка общих объектов в коллекции

* - исходный порядок в coin

* - обратный порядок в col 12

for (Int 1=0: 1<s1zeof(values)/s1zeof(values[0]): ++1) { IntPtr ptr(new 1nt(values[1])): colli.push back(ptr): coll2.push front(ptr):

Вывод содержимого обеих коллекций for each (colli.beginO , colli,endO.

prlntCountedPtr): cout « endl:



Рекомендации по выбору контейнера 229

for each Ссо112,beginO. coll2.endO.

printCountedPtr): cout « endl « endl:

/* Модификация значений в разных коллекциях

* - возведение в квадрат третьего значения в colli

* - изменение знака первого значения е colli

* - обнуление первого значения в со112 */

*со111[2] *= *со111[2]: (**со111.beginO) -1: (**со112.beginO) = 0:

Повторный вывод содержимого обеих коллекций for each (colU.beginO. colli.endO.

printCountedPtr): cout « endl;

for each (coll2.beg1n(). coll2.end().

printCountedPtr): cout « endl:

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

3 5 9 16 4

4 6 1 9 5 3

-3 5 81 1 6 О О 6 1 81 5 -3

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

В архиве Boost библиотек С++ (http: www.boostorg/) хранятся различные классы умных указателей, расширяющие стандартную библиотеку С++ (вероятно, вместо CounterPtro стоит поискать название shared ptr<>).

Рекомендации по выбору контейнера

Стандартная библиотека С++ содержит разные типы контейнеров, обладающие разными возможностями. Возникает вопрос: когда использовать тот или иной тип контейнера? В табл. 6.33 приводятся некоторые рекомендации. Однако эти общие утверждения не всегда согласуются с реальностью. Например, при малом количестве элементов фактор сложности можно не учитывать, потому что обработка малого количества элементов с линейной сложностью происходит быстрее, чем обработка большого количества элементов с логарифмической сложностью.



Таблица 6,33. Характеристики контейнеров STL

Вектор

Список

Множество

Мультимножество

Отображение

Мультиотображение

Типичная внутренняя

Динамический

Массив

Двусвязный

Бинарное

Бинарное

Бинарное

Бинарное

реализация

массив

массивов

список

дерево

дерево

дерево

дерево

Элементы

Значение

Значение

Значение

Значение

Значение

Пара «ключ/ значение»

Пара «ключ/ значение»

Возможность существования

Не для ключа

дубликатов

Поддержка произвольного

С ключом

доступа

Категория итератора

Произволь-

Произволь-

Двунаправ-

Двунаправлен-

Двунаправлен-

Двунаправлен-

Двунаправлен-

ный доступ

ный доступ

ленный

ный (константные элементы)

ный (константные элементы)

ный (константные ключи)

ный (константные ключи)

Скорость поиска

Медленная

Медленная

Очень медленная

Быс1рая

Быстрая

Бькл"рая для ключа

Быстрая для ключа

Быстрая вставка/удаление

В конце

В начале и в конце

Где угодно

Недействительность

При пере-

Всегда

Никогда

Никогда

Никогда

Никогда

Никогда

итераторов, ссылок

распределении

и указателей при

памяти

BcidBKe/удалении

Освобождение памяти

Никогда

Иногда

Всегда

Всегда

Всегда

Всегда

Всегда

от удаленных элементов

Возможность

резервирования памяти

Транзакционная

Присоединение/

Присоединение/

Все операции.

Все операции.

Все операции.

Все операции,

Все операции,

безопасность (успешное

удаление

удаление

кроме sortO

кроме вставки

кроме вставки

кроме BcidBKH

кроме BcidBKM

выполнение или

в конце

в начале

и присваивания

нескольких

нескольких

нескольких

нескольких

отсутствие изменений)

и в конце

элементов

элементов

элементов

элементов



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [ 70 ] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239