|
Программирование >> Операторы преобразования типа
К сожалению, тип sizejype (определяемый распределителем памяти строки) должен быть беззнаковым целым. Распределитель по умолчанию allocator использует в качестве size type тип size t (см. с. 706). Поскольку -1 преобразуется к беззнаковому целому типу, проз является максимальным беззнаковым значением этого типа. Тем не менее точное значение зависит от конкретного определения типа slze type. К сожалению, на практике максимальные значения оказываются различными. Более того, (unsigned long)-l отличается от (unsigned short)-l (если различаются размеры этих типов). Следовательно, показанное ниже условие может оказаться равным false, если переменная Idx равна -1, а idx и string: :npos относятся к разным типам: 1dx =- std::Str1ng::npos Пример: std::string s; int idx s.findCnot found ): Предположим, возвращается npos If (idx std::string::npos) { ОШИБКА: сравнение может не работать Один из способов предотвращения этой ошибки основан на прямой проверке результата поиска: 1f Cs.findChi ) == std::string::npos) { 1 Однако довольно часто в программе нужен индекс позиции, в которой было найдено совпадение. Другое простое решение заключается в определении собственного знакового значения для npos: const int NPOS = -1; Сравнение принимает несколько иной (и даже более компактный) вид: if Cidx = NPOS) { Работает почти всегда К сожалению, это решение не идеально - проверка завершится неудачей, если idx относится к типу unsigned short или индекс превышает максимальное значение int (именно из-за этих проблем такое решение не было стандартизировано). Однако поскольку на практике обе ситуации встречаются очень редко, обычно это решение работает. Но если вы хотите, чтобы программа была действительно переносимой, всегда используйте тип string::s\ze type для всех индексов строковых типов. В идеальном решении вам придется определить перефу-женные функции в зависимости от конкретного типа string::s\zeJCYpe. Вероятно, в будущем в стандарте появится более удачное решение этой проблемы. Поддержка итераторов для строк Строка представляет собой упорядоченную последовательность символов. Соответственно в стандартную библиотеку С++ был включен интерфейс, позволяющий использовать строки как контейнеры STL В частности, вызовом функций строковых классов можно получить итераторы для перебора символов строки. Если вы еще не знакомы с итераторами, считайте, что зто своего рода псевдозгказатели, ссылающиеся на отдельные символы строки (по аналогии с указателями, ссылающимися на отдельные символы С-строк). При помощи итераторов можно перебрать все символы строки. Для этого достаточно воспользоваться алгоритмами, входящими в стандартную библиотеку С++ или определяемыми пользователем. Например, вы можете отсортировать символы в строке, переставить их в обратном порядке или найти символ с максимальным значением. Строковые итераторы относятся к категории итераторов произвольного доступа. Это означает, что строковые итераторы поддерживают произвольный доступ к символам и могут использоваться со всеми алгоритмами (см. с. 105 и 257). Как обычно, типы строковых итераторов (iterator, constjterator и т. д.) определяются самим строковым классом. Конкретный тип зависит от реализации, но обычно строковые итераторы определяются в виде обычных указателей. На с. 264 описаны проблемы, возникающие из-за различий между итераторами, реализованными в виде указателей, и итераторами, реализованными в виде классов. Итераторы становятся недействительными при перераспределении памяти и при некоторых изменениях в данных, на которые они ссылаются. За подробностями обращайтесь на с. 471. Строковые функции для работы с итераторами в табл. 11.6 перечислены все функции строковых классов, предназначенные для работы с итераторами. Как обычно, итераторы beg и end определяют полуоткрытый интервал, который включает beg, но не включает end; такие интервалы часто обозначаются [beg,e?id) (см. с. 96). Чтобы обеспечить поддержку конечных итераторов вставки для строк, была определена функция pusli baclc(). Конечные итераторы вставки рассматриваются на с. 277, а пример их использования со строками можно найти на с. 484. Таблица 11.6. Строковые функции для работы с итераторами Выражение Описание S.beginO Возвращает итератор произвольного доступа для первого символа S.endO Возвращает итератор произвольного доступа для позиции за последним символом s.rbegInO Возвращает обратный итератор для первого символа при переборе в обратном направлении (то есть для последнего символа строки) Общие сведения об STL приводятся в главе 5. Выражение Описание S.rendO string s(beg, end) s.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 и возвращает итератор для позиции нового символа Вставляет nunn экземпляров символа с в позиции итератора pos и возвращает итератор для позиции первого из вставленных символов Вставляет все символы интервала [beg,end) в позиции итератора pos Удаляет символ, на который ссылается итератор pos, и возвращает позицию следующего символа Удаляет все символы интервала [beg,end) и возвращает позицию следующего символа Заменяет все символы в интервале [beg,end) символами строки str Заменяет все символы в интервале [beg,end) симвопами С-строки cstr Заменяет все символы в интервале [beg,end) len символами символьного массива cstr Заменяет все символы в интервале [beg,end) nunn экземплярами символа с Заменяет все символы в интервале [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 1s 38108 ): cout original; s endl;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |