Анимация
JavaScript
|
Главная Библионтека Класс напоминает стандартный класс умного указателя 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
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 |