Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 144
Текст из файла (страница 144)
Вызов аяя!уп (я, и, х) при помощи акк!уп (я[1), х) присваивает и копий х строке я. Функция сотраге () использует для сравнения символов 11 () и ед (). Она возвращает сп1, причем 0 означает точное совпадение, отрицательное число означает, что Глава 20. Строки 648 первый аргумент стоит лексикографически до второго, а положительное — что после. Такое использование возвращаемого значения аналогично функции и!гетр (! из стандартной библиотеки С Я 20.4.1). Функции, связанные с вводом/выводом, используются в реализации низкоуровневого ввода/вывода (6 21.6А). Расширенный символ (символ из расширенного набора) — то есть объект типа шсйаг 1(6 4.3) — похож на сйаг, по занимает два байта или больше.
Свойства шсйаг 1 описывает сЬаг 1пи1я<тсйаг 1>; 1етр!а1е<> и1гис1 сЬаг 1га11и<госЬаг и> ( 1урес!еУгосЬаг 1 сЬаг 1уре; 1уреде1' иипг 1!п1 1уре; 1уре<!ев" вггеатоДоД гуре; 1урес!е~ши1геатрои рои гуре; Д пододпо сЬог 1тйя<сЬаг> ); Тип шсйаг 1, как правило, используется для хранения символов из 16-разрядного набора — например, [Лисоде.
20.3. ТИП Ь861С 61Г1ПЦ Стандартные библиотечные возможности работы со строками базируются на шаблоне Ьаи!и и1г!пд, который предоставляет типы членов и операции, схожие с теми, что обеспечиваются стандартными контейнерами (8 16.3.1): 1етр1аге<с!авв СЬ, с!авв Тг = сЬа г 1га11в СЬ>, с!аии А = а!!оса1ог<СЬ» с!аии игдсЬаягс иЬ1пу( риЬ!!а Этот шаблон и все связанные с ним средства определены в пространстве илген и1с(и представлены заголовочным файлом <и1г!пу>.
Два определения типов обеспечивают для обычных строковых типов общепринятые имена: 1уреде~Ьавгс иптпу<сЬаг> вгггпд, гуредеУ Ьаягс и1ггпу<шсЬаг и гоигг!пу,. Тип Ьая!и и(г!пдпохож на пес!юг(6 16 3), за исключением того, что баас и1г!пу'вместо набора операций со списками, который предлагает иес1ог, обеспечивает некоторые типовые операции со строками, такие как поиск подстрок. Многие обычные применения строк лучше обслуживаются теми реализациями, которые минимизируют копирование, не используют свободной памяти для коротких строк, позволяют просто модифицировать более длинные строки и т. и.
(см. 6 20.6112]). Болыпое число функций для работы со строками отражает важность манипуляций со строками, а также тот факт, что некоторые машины предоставляют специальные аппаратные инструкции, связанные со строками. Такие инструкции разработчик библитеки может использовать особенно эффективно, если их смысл близок функциям из стандартной библиотеки.
Как и другис стандартные библиотечные типы, Ьая!с и1г!пу<7ь является конкретным типом (6 2.5.3, Я' 10.3) без виртуальных функций. Бго можно использовать 649 20.3. Тип Ьаз~с з1ппц в качестве члена при проектировании классов для более изощренного манипулиро- вания текстами, но он не предназначен для того, чтобы служить базовым для произ- водных классов (6 25.2.1; см. также 0 20.6(10]). 20.3.1.
Типы Подобно оес(ог, Ьая(с з(г(ау делает свои родственные типы доступными через набор имен типов членов: гетр!аге<с!аяя СЬ, с!аяя Тг = сЬаг 1га!1в<СЬ>, с!аяя А = а!!осагог СЬ» с!авв Ьавгс ягг!пу( риЬйс: //типа (очень похожена оес1ог, УМ и т. пн ф !6.3)ь // специ4ично для Ьакгс к(г!ььу 1урейе/ Тг 1ги!1в 1уре; 1урейе/1урепате Тгжлаг 1уре юа!ие 1урс; 1урейе/А а!!оса1ог 1уре; 1урейе/1урепатеАкзые 1уре ягяе 1уре; 1урейеХ1урепатеАсЩХегепсе 1уредфегепсе 1уре; 1урейе/1урепате Асге~егепсе ге~егепсе; 1урейе/1урепатеАссопя1 ге~егепсе сопя! геТегепсе; 1урейе/' 1урепате Асрош1ег рот1ег; 1урейеТ 1урепате Ачсопвгро!п1ег сопкгро!п1ег, 1урейе/(тр!етепкапоп йфпей !1ега1ог; 1уреде~!тр!етептайоп ЙеЯпей сопв1 !1ега1ог; 1уреде( ягдьгеоегве !1ега1ог<!1ега1ог> геоегяе 11ега1ог; 1урейе/я1д: геоегке Иега1ог<сап<1 !1ега1ол соая1 геоегзе !1ега1ог; Понятие Ьая!с к(г!пдв добавление к простому Ьав(с к1г!ад<сбое>, известному как я1г!пд, полдерживает строки с разнообразными символами.
Например; 1урейе(Ьав1с к(г(ау<пав!дней сдат ЕУвгг!пд; вггис1 /сдпг( /* ... "/ ); // тип японских букв 1урейе/Ьавгс кгггпуч3сдаг> Лв1г!птр Строками из таких символов можно пользоваться точно также, как строками из сйап пока зто позволяет семантика символов. Например: // и. 3 20.33 ! // см.ф 20.3.4 (!вптпу Ягк1 тогд (Ув1ггпуй ия( ( (!кгг!пд" я!ке 1уре роя = икрой (' '); ге1игп с!в!ггпу (ия, О, ров) йяптпуЯгя1 коогй(Тк1г!пуй!к( ( йя1г!пуск!яе 1уре рок = !я/ьпд (' '(, ге1игп Лв(гьпу ~ия, О, рок( //см.
ЗК 20.3.1! Осм.у 20.г.у Глава 20. Строки 650 Естественно, также можно пользоваться шаблонами, принимающими строки в каче- стве аргумента; 1етр!а1е<с!авз Я> 8 йгяг вогй(53 я) ( 1урепате$сиее 1урероя=я,Гтй(' ); ге!игл Я (з, О, роя); ) // слс. ~ 20.3. ! ! // слеф 20.3.4 20.3.2. Итераторы Как и другие контейнеры, я1г!пд предоставляет итераторы для обычных и обратных итераций; 1етр!а1е«с!аяв СЬ, с!аяя 2г= сбаг 1га!!з<СЬ>, с!лвя А = а!!оса!ог«СЬ» с!авя Ьав!с згг!пу( риб!!а //".
0 итераторы (так псе как оес1ог, уя1 и т ля 3" !6.3.2): !1ега1ог беу!п (); сопя1 !'1ега1ог Ьеу!и () солз1; !1егагогепй(); сопя1 Нега 1ог епй () сопя1; геоегяе Пега!ог гЬеу!п (); сопв1 геоегяе Пега1ог гбеу!и () сопя1; геоегяе Пега1ог гепй () сопя! гелегве !1ега1оггепй() соля!; //- ); Поскольку в!г!лз'имеет типы членов и функции, требующиеся для получения ите- раторов, строки можно использовать со стандартными алгоритмами (глава 18). На- пример: оо!йЯягггпдй з) ( ятьйлдс !гега !ог р=)!ай (з.
Ьеу1л (), з елй (), 'а ); ) Наиболее часто используемые операции над строками обеспечиваются непосредственно самим з!г!пп. Надеюсь эти версии будут оптимизированы для строк помимо общей оптимизации универсальных алгоритмов. Стандартные алгоритмы (глава 18) не так полезны для строк, как можно было бы подумать. Универсальные ачгорлп мы имеют тенденцию считать, что элементы контейнера значимы и сами по себе, в изоляции. Как правило, для строк зто не так. Значение строки закодировано в точном соблюдении последовательности се символов, Поэтому Ьазгс я!г!пу«Сл> может содержать любой символ из набора СЬ.
В частности, я!г!пд может содержать 0 (ноль). «Символьный» тип СЬ обязан вести себя подобно настоя- гцны символам. В частности, он не может содержать определяемые пользователем ко- пирующий конструктор, деструктор или оператор копирующего присваивания. 651 20.3. Тип Ьаз(с я1ппд сортировка строки (то есть сортировка символов в строке) лишает ее смысла, в то время как сортировка универсального контейнера обычно делает его более полезным. Итераторы иЕг!лд не осуществляют проверку диапазона. 20.3.3. Доступ к элементам К отдельным символам в строке можно обратиться по индексу: 1етр!а ге<с)ияя СЬ, с!ияя Тг = сЬаг 1гштя<СЬ>, с!аияА=аИоса)ог<СЬ» сЕаяя Ьаи!с я1гтд( риЬЕЕс: 0-.
//доступ кзлелентаи !как для оегЕогг и" Еб.З.З) сопя! ге~егепсе орегагогГ] (гдяе 1уре л) сопя!; //обрагг!ение без лроверкгг ге/егепсе орега1огП (игее 1уре л); // обращение г вроверкод сопя! ге~егепсе ат(явте 1уре п) сопи!, геХегелсе аг(и!яе 1уре п); //-. ); При обращении за диапазон функция аЕ () сгенерирует исключение оиЕ оЕ галде. По сравнению с векторс>м, строкам не хватает операций / оаЕ () и ЬасЬ (). Чтобы обратиться к первому и последнему символам строки, мы должны написать соответственно и!ЕЕ] и я)я.ЕелдЕЬ ()-!].
Эквивалентность указателей и массивов Я 5.3) для строк я!пад не выполняется. Если я — зто строка и1плд, то йи[0] — не то же самое, что ж 20.3.4. Конструкторы Набор операций инициализации н копирования для строк во многом отличается от того, что реализовано для других контейнеров Ц 16.3А): Еетр!а1е<с!аяи СЬ, с1аяя Тг = сЬаг 1ганя<С)г, сЕаияА = аИосаЕог.СЬ» с!аяя Ьои!с я1ппу( риЫ>с; 0 ... //конструкторы и пр. Енелного лохоже на сесгоги Ьтдг у" !б.3.4) ехрусп Ьаис игг(лд (сопя!Ай а =А ()); Ьаи(с иге!ау(сопяЕЬпяс иЕгтуйя,явте 1урероя= О,я!ее 1уреп= прои, соля1Айп =А Я; 6аи!с игг!пу(сопя1СЬ* р, якие 1уре и = прои, соп>1 Лй и =Л Ш; ЬаиЕс и1ппд (соли! СЬ* р, сопи!Ай а = А ()), Ьигдс и1ппд(игяе 1уре л, СЬ с, сопя1Айа =А()); 1етр)а1е<с!аяя 1п>Ьагдс я!пад(1п Ьед!л, 1п елд, соля!Ай а = А ()); -Ьая!с я!пад() я1апс сопя1гдее 1уре прои; // лгоркер «все сггяволы > Строку и!пад можно инициализировать С-строкой, другой строкой иЕплд, подстрокой строки иЕг!адили последовательностью символов.
Однако ее нельзя инициализировать символом или числом; Глава 20. Строки 652 ооЫ/(сбаг'р, оес1ог сбаг»й о) ( ягг(па яд; ясг1пд з00 = "; // пушная строка // тоже пустая строка // ошибка: сбаг не преобразуется в я1г(па // ошибка; 1пС не преобразуется в я1ппе //ошибка; нет конструктора // с одним аргументол! гп // 7 копий 'а'; то еппь 'оаааааа ягпляя1 = 'а', ягг(ляя2 = 7; ягппд'яЗ (7); я6 (ля я4 (7, 'а'); ягг(ля я5 = "Фродо; я 1ппя яб = я5; ягг(па я 7(я5, 3, 2); я1ппяяд (р»7, 3) я1ппд яу (1л, 7, 3); // копия 'Фродо' //копия яб // ьб[З) и яб[4): то есть "до" //р[7), р[8) и р[У) //з1ппд(я1ппу(р), 7, 3), // возлюжно расточительно // копирование всех символов из о язппяя10 (о Ье81п (), о епд ()); ) оо1д/(яЫля я) ( шягг(па шя (я Ьеагп (), кепд ()); //- // копирование.