Программирование >>  Операторы преобразования типа 

1 ... 148 149 150 [ 151 ] 152 153 154 ... 239


соответствует индекс О, а последнему - индекс length()-l. Тем не менее существуют и различия.

О Оператор [] не проверяет правильность индекса, передаваемого в аргументе, а функция at() выполняет такую проверку. При вызове функции at() с недействительным индексом генерируется исключение out of range. При вызове оператора [] с недействительным индексом возможны непредсказуемые последствия - скажем, недопустимые обращения к памяти, которые становятся причиной неприятных побочных эффектов, или аварийное завершение программы (кстати, это относительно удачный вариант, по крайней мере, вы будете знать, что в программе что-то не так).

О Для константной версии оператора [] позиция за последним символом считается действительной. В этом случае текущее количество символов является допустимым индексом. Оператор возвращает значение, сгенерированное конструктором по умолчанию для типа символов. Следовательно, для объектов типа string возвращается символ \0.

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

Пример:

const std;:string csCnico );

cs содержит символы n.i.c.o

std::string sCabcde ):

s содержит символы a.b.c.d.e

s[2]

Символ с

s.at(2)

Символ с

s[100]

ОШИБКА; непредсказуемые последствия

s.atClOO)

Исключение out of range

s[s.IengthO]

0Ш1БКА: непредсказуемые последствия

cs[cs. IengthO]

Символ \0

s.atCs.IengthO)

Исключение out of range

cs.at(s.IengthO)

Исключение out of range

Чтобы программа могла изменять отдельные символы строки, неконстантные версии [] и at() возвращают ссылки на символы. Помните, что при перераспределении памяти ссылки становятся недействительными:

std::string sCabcde ); s содержит символы a.b.c.d.e

charS г - s[2]; Ссылка на третий символ

char* 3 = &s[3]: Указатель на четвертый символ

г - X: ОК. S содержит символы a.b.X.d.e

*р - Y : ОК. S содержит символы a.b.X.Y.e



S = new long value : При перераспределении памяти г и р

становятся недействительными г = Х : ОШИБКА: непредсказуемые последствия

*р = Y ; ОШИБКА: непредсказуемые последствия

Для предотвращения ошибок времени выполнения необходимо зарезервировать достаточную емкость функцией reserve() перед инициализацией г и р.

Ссылки и указатели, ссылающиеся на символы строки, становятся недействительными при выполнении следующих операций:

О обмен значений функцией swap();

О чтение нового значения оператором >> или функцией getllne();

О экспорт содержимого строки функцией data() или c str();

О вызов любой из неконстантных функций класса at(), begin(), rbegin(), end() или rend() без оператора [];

О вызов оператора [] после любой из функций at(), begln(), rbeglnQ, end() или rend().

Данные условия также относятся к итераторам (см, с. 480).

Операции сравнения

Для строк определены стандартные операторы сравнения. В качестве операндов могут использоваться как строки, так и С-строки:

std;:str1ng sl.s2:

si == s2 Возвращает true, если si и s2 содержат одинаковые символы si < hello Проверяет, что si меньше С-строки hello

При сравнении строк операторами <, <=, > и >= символы сравниваются в лексикографическом порядке в соответствии с их текущими трактовками. Например, все следующие условия равны true:

std std std

str1ngC aaaa ) < std strlngCaaaa ) < std stringCaaaa ) < std

string( bbbb ) str1ng( abba ) stringCaaaaaa

При помощи функций compareO можно сравнивать подстроки. Эти функции позволяют использовать более одного аргумента для определения строк, поэтому подстрока может задаваться индексом и длиной. Помните, что функции compareO возвращают не логический признак, а целочисленный код. Ноль является признаком совпадения строк; отрицательное значение указывает на то, что *this меньше заданной строки, а положительное значение - что *this больше. Пример;

std:;strlng sCabcd );

s.compareCabcd ) Возвращает О

s.compareCdcba ) Возвращает значение <0 Cs меньше)

s.compareC ab ) Возвращает значение >0 (s больше)

s.conipare(s) Возвращает О (s равно s)



s.compare(0.2.5,2.2) Возвращает значение <0 ( аЬ меньше cd )

S.compared.2. bcx .2) Возвращает О ( be равно be )

Если сравнение должно производиться по другому критерию, вы можете оп-ределрггь этот критерий и воспользоваться алгоритмами сравнения STL (пример приводится на с. 480) или же применить специальные трактовки символов, позволяющие сравнивать строки без учета регистра символов. Но так как строки со специальным классом трактовок относятся к другому типу данных, они не могут комбинироваться с объектами типа string (см. пример на с. 485).

В программах, ориентированных на международный рынок, строки иногда приходится сравнивать в соответствии с локальным контекстом. Для этой цели в классе iocaie определен удобный оператор () (см. с. 676). Он использует фацет контекстного сравнения, предназначенный для сравнения строк с учетом национальных стандартов. За подробностями обращайтесь на с. 697.

Модификация строк

Модификация строк производится различными операторами и фушсциями классоа

Присваивание

Оператор = присваивает строке новое значение, заданное в виде строки, С-строки или отдельного символа. Если новое значение описывается несколькими аргументами, для его присваивания можно воспользоваться функцией assign(). Пример:

const std::strlng aStringCothello ): std::str1ng s:

s = aString: Присваивание строки othello

s = two\nllnes ; Присваивание С-строки

s = ; Присваивание отдельного символа

s.assign(aString): Присваивание othello (эквивалент оператора =) s.ass1gn(aStrlng.l.3): Присваивание подстроки the s.asslgn(aStr1ng.2.std::str1ng::npos): Присваивание подстроки heTlo

s.asslgn( two\nl1nes ); Присваивание С-строки (эквивалент оператора -) s.assign( nico .5): Присваивание символьного массива: n.i.c.oAO s.ass1gn(5. х ); Присваивание символьного массива: х.х.х.х.х

Также строке можно присвоить интервал символов, заданный двумя итераторами. За подробностями обращайтесь на с. 480.

Обмен значений

В типе string, как и во многих нетривиальных типах, определена специализированная версия функции swap(), которая меняет местами содержимое двух строк (глобальная функция swap() представлена на с. 81). Специализация swap() для строк гарантирует постоянную сложность, поэтому ее рекомендуется использовать для обмена строковых значений и присваивания, если присвоенная строка становится ненужной после выполнения операции.



1 ... 148 149 150 [ 151 ] 152 153 154 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика