3.4.2. Класс stringКак мы только что видели, применение встроенного строкового типа чревато ошибками
и не очень удобно из-за того, что он реализован на слишком низком уровне. Поэтому
достаточно распространена разработка собственного класса или классов для представления
строкового типа – чуть ли не каждая компания, отдел или индивидуальный проект
имели свою собственную реализацию строки. Да что говорить, в предыдущих двух
изданиях этой книги мы делали то же самое! Это порождало проблемы совместимости
и переносимости программ. Реализация стандартного класса string стандартной
библиотекой С++ призвана была положить конец этому изобретению велосипедов.
Класс string стандартной библиотеки С++ реализует все перечисленные операции
(и гораздо больше, как мы увидим в главе 6). В данном
разделе мы научимся пользоваться основными операциями этого класса. #include <string> Вот пример строки из предыдущего раздела, представленной объектом типа string и инициализированной строкой символов: #include <string> string st( "Цена бутылки вина\n" ); Длину строки возвращает функция-член size() (длина не включает завершающий нулевой символ). cout << "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n"; Вторая форма определения строки задает пустую строку: string st2; // пустая строка Как мы узнаем, пуста ли строка? Конечно, можно сравнить ее длину с 0: if ( ! st.size() ) // правильно: пустая Однако есть и специальный метод empty(), возвращающий true для пустой строки и false для непустой: if ( st.empty() ) // правильно: пустая Третья форма конструктора инициализирует объект типа string другим объектом того же типа: string st3( st ); Строка st3 инициализируется строкой st. Как мы можем убедиться, что эти строки совпадают? Воспользуемся оператором сравнения (==): if ( st == st3 ) // инициализация сработала Как скопировать одну строку в другую? С помощью обычной операции присваивания: st2 = st3; // копируем st3 в st2 Для конкатенации строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки: string s1( "hello, " ); string s2( "world\n" ); Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом: string s3 = s1 + s2; Если же мы хотим добавить s2 в конец s1, мы должны написать: s1 += s2; Операция сложения может конкатенировать объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова – объектами класса string: const char *pc = ", "; string s1( "hello" ); string s2( "world" ); Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string: string s1; const char *pc = "a character array"; s1 = pc; // правильно Обратное преобразование, однако, не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции: char *str = s1; // ошибка компиляции Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с несколько странным названием c_str(): char *str = s1.c_str(); // почти правильно Функция c_str() возвращает указатель на символьный массив, содержащий строку
объекта string в том виде, в каком она находилась бы во встроенном строковом
типе. const char * (В следующем разделе мы расскажем о ключевом слове const). Правильный вариант инициализации выглядит так: const char *str = s1.c_str(); // правильно К отдельным символам объекта типа string, как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания: string str( "fa.disney.com" ); int size = str.size(); for ( int ix = 0; ix < size; ++ix ) if ( str[ ix ] == '.' )
replace( str.begin(), str.end(), '.', '_' ); replace() – один из обобщенных алгоритмов, с которыми мы познакомились в разделе 2.8 и которые будут детально разобраны в главе 12. Эта функция пробегает диапазон от begin() до end(), которые возвращают указатели на начало и конец строки, и заменяет элементы, равные третьему своему параметру, на четвертый. Упражнение 3.12Найдите ошибки в приведенных ниже операторах: (a) char ch = "The long and winding road"; (b) int ival = &ch; (c) char *pc = &ival; (d) string st( &ch ); (e) pc = 0; (i) pc = '0'; Упражнение 3.13Объясните разницу в поведении следующих операторов цикла: while ( st++ ) ++cnt; Упражнение 3.14Даны две семантически эквивалентные программы. Первая использует встроенный строковый тип, вторая – класс string: // ***** Реализация с использованием C-строк ***** #include <iostream> #include <cstring> Что эти программы делают? Упражнение 3.15Могли бы вы что-нибудь улучшить или дополнить в наборе операций класса string, приведенных в последнем разделе? Поясните свои предложения Назад ВпередСодержание |
2012-06-11 19:06:00 Алексей Здравствуйте! А можно ли с помощью класса string добавить в строку после каждого символа пробел или нет? Заранее спасибо 2016-04-27 14:52:24 Андрей а как сделать так чтобы введённый текст форматировался так: вводится максимальная длина строки, и если строка превышает это значение то не влезавшее слово и остальной текст перекидывает на след строку, и так далее форматирует? 2017-12-03 20:42:19 alert() <script>alert()</script> 2017-12-08 06:39:07 Alex alert, проверил? Оставить комментарий: |