Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 70
Текст из файла (страница 70)
Запомните, что это не доводы в пользу отказа от обычных, оканчивающихся нулем массивов. Они остаются наиболее эффективным способом реализации символьных строк. Тем не менее, если при создании приложения скорость выполнения программы не являетсядоминирующим фактором, новый класс string предоставляет вам безопасный и полностью интегрированный в среду программирования C++ способобработки строк.464СамоучительС++Хотя строковый класс традиционно не считают частью библиотеки стандартных шаблонов, тем не менее, это один из определенных в C++ классовконтейнеров.
Это, в частности, означает, что он поддерживает описанные впредыдущем разделе алгоритмы. Кроме этого, для обработки строк имеютсядополнительные возможности. Чтобы получить доступ к классу string, впрограмму следует включить заголовок <string>.Класс string очень велик, в нем имеется множество конструкторов и функций-членов. Помимо этого многие функции-члены имеют массу перегруженных форм.
По этой причине в одной главе невозможно рассказать о всехчленах класса string. Вместо этого мы исследуем только некоторые, основные его возможности. После получения базовых знаний о работе классаstring в целом, все остальное вы сможете легко понять самостоятельно.В классе string поддерживается несколько конструкторов. Ниже представлены прототипы трех из них, которые чаще всего используются:String () ;string(const char *строка);string(const string Ьстрока);В первой форме создается пустой объект типа string. Во второй форме объект типа string из оканчивающейся нулем строки, обозначенной указателем строка.
Эта форма обеспечивает преобразование из оканчивающейсянулем строки в объект типа string. В третьей форме объект типа string создается из другого объекта типа string.Ниже перечислена часть операторов, допустимых при работе с объектамитипа string:ОператорЗначение=Присваивание+Конкатенация+=Присваивание с конкатенациейиРавенство!=Неравенство<Меньше<=Меньше или равно>Больше>=Больше или равно[]Индекс«Вывод»ВводГлаваi_?4, Библиотека стандартных шаблонов465Указанные операторы позволяют использовать объекты типа string в обычных выражениях и отказаться от вызовов специализированных функций,например, функций strcpyQ или strcatQ, Как правило, объекты типа string ввыражениях можно записывать вместе с обычными, оканчивающимися нулем строками. Например, объект типа string можно присвоить оканчивающейся нулем строке.Оператор + можно использовать для конкатенации объекта типа string сдругим объектом типа string или для конкатенации объекта типа string сострокой в стиле С.
Поддерживаются следующие варианты:string + stringstring + C-stringC-atring + stringКроме этого, оператор + можно использовать для присоединения одиночного символа к концу строки.В классе string определена константа npos, обычно равная -1. Эта константаотражает максимально возможную длину строки.Несмотря на то, что большая часть операций над строками может быть выполнена с помощью строковых операторов, для некоторых наиболее сложных или необычных операций нужны функции — члены класса string.
Хотяих слишком много для одной главы, о некоторых наиболее полезных здесьбудет рассказано. Чтобы присвоить одну строку другой используется функция assign (). Ниже представлены две основные формы этой функции:string Sassign(const string &объекя_строка,size_type начало, siza__type число) ;string Sassign(const char *строка, size_type число);В первой форме несколько символов, количество которых равно параметручисло из объекта объект_строка, начиная с индекса начало, присваиваютсявызывающему объекту. Во второй форме вызывающему объекту присваивается первые несколько символов, количество которых равно параметру числоиз оканчивающейся нулем строки строка. В обоих случаях функция возвращает ссылку на вызывающий объект. Очевидно, что для присваиванияодной целой строки другой гораздо проще использовать оператор =.
Функция assign О может понадобиться только при присваивании части строки.Присоединить часть одной строки к другой можно с помощью функциичлена append(). Ниже представлены две основные формы этой функции:string fiappend (const string ЕооЧежт_с!грожа,size_type начало, size_type число) ;string Sappend(const char *строка, size__type число) ;В первой форме несколько символов, количество которых равно параметручисло из объекта объект_строка, начиная с индекса начало присоединяютсяк вызывающему объекту.
Во второй форме к вызывающему объекту присос-466Самоучитель C++диняются первые несколько символов, количество которых равно параметручисло, из оканчиваюшейся нулем строки строка. В обоих случаях функциявозвращает ссылку на вызывающий объект. Очевидно, что для присоединения одной целой строки к другой гораздо проще использовать оператор +.Функция appendQ может понадобиться только при присоединении частистроки.С помощью функций insert() и replaceQ можно соответственно вставлятьили заменять символы в строке. Ниже представлены прототипы основныхформ этих функций:string &insert(size_type начало, const string £ооЧежт_с!грока) ;string fiinsert(size_type начало, const string &объект_сяроха,size_type начало_вставки, size_typa число);string fireplace (size_type начало, size_type тесло,const string йобФекг строка) ;string fireplace (size_type начало, size_type ксх_номер,const string &объект_строка,size type начало замени, size type число замены) ;В первой форме функции insertQ объект объект_спгрока вставляется в вызывающую строку по индексу начало.
Во второй форме функции insert() числосимволов из объекта объект__строка, начиная с индекса начало_вставки,вставляется в вызывающую строку по индексу начало.В первой форме функции replace() число символов, начиная с индекса начало, заменяется в вызывающей строке объектом объект^строка. Во второйформе функции replaceQ в вызывающей строке заменяется исх_число символов, начиная с индекса начало, при этом из объекта объект_строка берутся число_замены символов, начиная с индекса начало_замены. В обоих случаях функция возвращает ссылку на вызывающий объект.Удалить символы из строки можно с помощью функции eraseQ. Ниже показана одна из форм этой функции:string fierase(size_type начало = 0, size_type число = npos);Функция удаляет число символов из вызывающей строки, начиная с индексаначало. Возвращаемым значением является ссылка на вызывающий объект.В классе string поддерживается несколько функций-членов, предназначенных для поиска строк.
Среди них имеются функции find() и rfindQ. Нижепоказаны прототипы основных версий этих функций:size_type find (const string Ьобъект__строка,size_type начало = 0) const;size_type rfind (const string &объек<р_строха,size_type начало = npos) const;Глава 14. Библиотека стандартных шаблонов467^Начиная с индекса начало функция find() ищет в вызывающей строке первое совпадение со строкой, содержащейся в объекте объект_строка. Еслиискомая строка найдена, функция find() возвращает индекс вызывающейстроки, соответствующий найденному совпадению. Если искомая строка ненайдена, функция fmd() возвращает значение npos.
В противоположностьфункции find(), функция rfindQ, начиная с индекса начало, но в обратномнаправлении, ищет в вызывающей строке первое совпадение со строкой,содержащейся в объекте объект_строка. (То есть ищет последнее совпадение со строкой, содержащейся в объекте объект_строка.) Если искомаястрока найдена, функция rfindQ возвращает индекс вызывающей строки,соответствующий найденному совпадению. Если искомая строка не найдена, функция iTind() возвращает значение npos.Для сравнения целых строковых объектов удобнее всего пользоваться описанными ранее перегруженными операторами отношения. Тем не менее,если вы захотите сравнить части строк, вам понадобится функция-член сотраге().
Ниже представлен прототип этой функции:int compare(size_type начало,size_type число,const string 6объвкч!_строка)const;Здесь с вызывающей строкой сравниваются число символов объекта объект_строка, начиная с индекса начало. Если вызывающая строка меньше,чем объект_строка, функция compareQ возвращает отрицательное значение.Если вызывающая строка больше, чем объект^строка, функция сотраге()возвращает положительное значение. Если вызывающая строка равна объекту объект_строка, возвращаемое значение функции сотраге() равно нулю.Хотя объекты типа string сами по себе очень удобны, иногда у вас все жебудет возникать необходимость в версии строки в виде массива символов,оканчивающихся нулем.
Например, объект типа string можно использоватьдля образования имени файла. Однако при открытии файла вам придетсязадавать указатель на стандартную, оканчивающуюся нулем строку. Для решения проблемы в классе string имеется функция-член c_str(), прототипкоторой показан ниже:const char *c_str() const;Функция возвращает указатель на оканчивающуюся нулем версию строки,содержащуюся в вызывающем объекте типа string. Оканчивающаяся нулемстрока не должна меняться.
Кроме этого, если над объектом типа string выполнялись какие-либо другие операции, правильность выполнения функцииc_str() не гарантируется.Поскольку класс string является контейнером, в нем поддерживаются функции beginQ и end(), возвращающие соответственно итератор начала и концастроки.
Также поддерживается функция sizeQ, возвращающая текущее число символов строки.468Самоучитель C++Примеры1.—^Хотя мы уже привыкли к традиционным строкам в стиле С, в C++ классstring делает обработку строк существенно проще. Например, при работе собъектами типа string для присваивания строк можно использовать оператор—, для конкатенации строк — оператор +, а для сравнения строк — различные операторы сравнения. В следующей программе показаны эти операции.// Короткий пример использования строкового класса^include <iostream>ttinclude <string>using namespace std;int(main()string strl("Представление строк"};string str2("Вторая строка");string str3;// присваивание строкstr3 = strl;cout « strl « "\n" « str3 « "\n";// конкатенация двух строкstr3 = strl + Str2;cout « str3 « "\n";// сравнение строкif(str3 > strl) cout « "str3 > strl\n";if(str3 == strl+str2) cout « "str3 — strl+str2\n";// строковому объекту можно присвоить обычную строкуstrl = "Это обычная строка\п";cout « strl;// создание строкового объекта// с помощью другого строкового объектаstring str4(strl);cout « str4;// ввод строкиcout « "Введите строку: ";cin » str4;cout « str4;return 0;После выполнения программы на экране появится следующее:Представление строкПредставление строкГлава 14.