Анимация
JavaScript
|
Главная Библионтека Поддержка итераторов для строк Строка представляет собой упорядоченную последовательность символов. Соответственно в стандартную библиотеку С++ был включен интерфейс, позволяющий использовать строки как контейнеры STL В частности, вызовом функций строковых классов можно получить итераторы для перебора символов строки. Если вы еще не знакомы с итераторами, считайте, что зто своего рода псевдозгказатели, ссылающиеся на отдельные символы строки (по аналогии с указателями, ссылающимися на отдельные символы С-строк). При помощи итераторов можно перебрать все символы строки. Для этого достаточно воспользоваться алгоритмами, входящими в стандартную библиотеку С++ или определяемыми пользователем. Например, вы можете отсортировать символы в строке, переставить их в обратном порядке или найти символ с максимальным значением. Строковые итераторы относятся к категории итераторов произвольного доступа. Это означает, что строковые итераторы поддерживают произвольный доступ к символам и могут использоваться со всеми алгоритмами (см. с. 105 и 257). Как обычно, типы строковых итераторов (iterator, constjterator и т. д.) определяются самим строковым классом. Конкретный тип зависит от реализации, но обычно строковые итераторы определяются в виде обычных указателей. На с. 264 описаны проблемы, возникающие из-за различий между итераторами, реализованными в виде указателей, и итераторами, реализованными в виде классов. Итераторы становятся недействительными при перераспределении памяти и при некоторых изменениях в данных, на которые они ссылаются. За подробностями обращайтесь на с. 471. Строковые функции для работы с итераторами в табл. 11.6 перечислены все функний строковых классов, предназначенные для работы с итераторами. Как обычно, итераторы beg и end определяют полуоткрытый интервал, который включает beg, но не включает end; такие интервалы часто обозначаются [beg,e?id) (см. с. 96). Чтобы обеспечить поддержку конечных итераторов вставки для строк, была определена функция push baclc(). Конечные итераторы вставки рассматриваются на с. 277, а пример их использования со строками можно найти на с. 484. Таблица 11.6. Строковые функции для работы с итераторами Выражение Описание s.beginO Возвращает итератор произвольного доступа для первого символа s.endO Возвращает итератор произвольного доступа для позиции за последним символом s.rbegInO Возвращает обратный итератор для первого символа при переборе в обратном направлении (то есть для последнего символа строки) Общие сведения об STL приводятся в главе 5. Выражение Описание s.rendO string s(beg, end) 5.append(beg, end) s.assign(beg, end) s.insert(pos, c) s.insert(pos,num,c) s.insert(pos, beg, end) s.erase(pos) s.erase(beg, end) s.replace(beg, end, str) s.replace(beg,end/CStr) s.replace(beg, end, cstr, len) s.replace(beg,end,num,c) s.replace(beg, end, newBeg, newEnd) Возвращает обратный итератор для позиции за последним символом при переборе в обратном направлении (то есть для позиции перед первым символом строки) Создает строку, инициализированную всеми символами интервала [beg,end) Присоединяет к сфоке все символы интервала [beg,end) Присваивает строке содержимое интервала [beg,end) Вставляет символ с в позиции итератора pos и возвращает итератор для позиции нового символа Вставляет num экземпляров символа с в позиции итератора pos и возвращает итератор для позиции первого из вставленных символов Вставляет все символы интервала [beg,end) в позиции итератора роз Удаляет символ, на который ссылается итератор pos, и возвращает позицию следующего символа Удаляет все символы интервала [beg,end) и возвращает позицию следующего символа Заменяет все символы в интервале [beg,end) символами строки str Заменяет все символы в интервале [beg,end) симвопами С-строки cstr Заменяет все символы в интервале [beg,end) len символами символьного массива cstr Заменяет все символы в интервале [beg,end) num экземплярами символа с Заменяет все символы в интервале [beg,end) всеми символами интервала [newBeg,newEnd) Пример использования итераторов со строками при помощи строковых итераторов можно преобразовать все символы строки к верхнему или нижнему регистру всего одной командой. Пример: string/iterLcpp #1nclude <strlng> #lnclude <lostreani> #1nclude <algorithni> #1nclude <cctype> using namespace std; 1nt mainO Создание строки string sCThe zip code of Hondelage in Germany is 38108"): cout « "original; " « s « endl; Преобразование всех символов к нижнему регистру transform (s.beginO. s.endO. Источник S.beginO. Приемник tolower); Операция cout « "lowered; " « s « endl; Преобразование всех символов к верхнему регистру transform (s.beginO, s.endO. Источник S.beginO. Приемник toupper); Операция cout « "uppered: " « s « endl; Результат вьтолнения программы выглядит так: original: The zip code of Hondelage 1n Germany Is 38108 lowered; the z1p code of hondelage In germany Is 38108 uppered: THE ZIP CODE OF HONDELAGE IN GERMANY IS 38108 Обратите внимание на устаревшие функции tolower() и toupper() языка С, использующие универсальный локальный контекст. При работе с другими локальными контекстами следует задействовать новые формы функций tolower() и toupper(). Подробности приводятся на с. 689. Следующий пример показывает, как при помощи STL задать собственные критерии поиска и сортировки. В этом примере производится поиск и сравнение строк без учета регистра символов. str1ng/1ter2.cpp #1nclude <str1ng> #1nclude <iostream> #1nclude <algorithm> using namespace std; bool nocase compare (char cl. char c2) { return toupper(cl) == toupper(c2): Int main() { string si("This is a string"); string s2("STRING"); Сравнение строк без учета регистра символов If (si.SizeO = s2.SizeO && Проверить совпадение размеров equal (si.beginO.si.endO. Первая строка s2.beginO. Вторая строка nocase compare)) { Критерий сравнения cout « "the strings are equal" « endl; 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 |