Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 148
Текст из файла (страница 148)
Для шаблонов со многими параметрами это приводит к некоторой тяжеловесности записи в связи с многократными упоминаниями параметров. С другой стороны, применение конкатенации удобно и наглядно. Например: яп!ид сагир(е(е иатеЗ (сопи з(г(ндя у(гя( пате, сопя( з(пиеа Тат!!у нате) 1 ге(игл!<гз! нате ч ' ' ч (атйу нате< ) Удобство записи достигается за счет некоторо(о понижения эффективности по сравнению с функцией сотр(е(е пате(), так как сотр1е(е пате3() нуждается в создании одной дополнительной временной переменной (510.4.10). Мой опыт показывает, что это редко когда имеет большое значение, но об этом все же лучше помнить при написании вложенных циклов.
В наиболее критичных ситуациях можно организовать функцию сотр!е(е пате() как встраиваемую или выполнить композицию строк с помощью низкоуровневых операций (В20.б)14]). 20.3. Стандартный строковый шаблон Ьаяс зтппй 705 20.3.11. Поиск Имеется огромное количество функций поиска; гетр)а!в<с!азз СЬ, с!азз "лс = сЬае гса11з<СЬ>, с)аяз А = а!!осагог<СЬ» с!азз Ьаяс я!пад ( риЬДс: У...
!! поиск подлоследовательности (вроде яеагсб0 я!8.5.5): з(ге гуре(гпй(сопя Ьаяс ягг!пба я, з!ге гуре ! = 0) сопя; яге курву)пй(сопя СЬ* р, яге (уре г, яике гуре п) сопи! з(ге гуре(тй(сопя! СЬ* р, з!ге гуре г' = 0) соля!; зае туре !)пй(СЬ с, я(ге гуре1 = О) сопя; добротный поиск подпоследовательности с конца (вроде))пй епй(), В!8.5.5)г к!ге гуре гукай(сопя! Ьаяс ягг!ляа з, з)ге гуре г = прок) сопя!; яге (уре Япй(сот! СЬ* р, яге гуре1, я)ге гуре и) сопя!; з(ге гуре Обпй (солзг СЬ* р, япе гуре г' = проз) соти! яге гуре е)тй (СЬ с, я(ге гуре! = проз) сот!; (поиск первого символа (любого), входящего в аргумент: я1ге гуре()лй ггеяг ог'(соли! Ьаяс кгс(пба з, яге (уре г' = 0) сопзг; з!ге гуре!)пй (яяг о! (сопя! сь* р, я(ге гуре и, яге гуре и) сопя!! я!ге гуре!)пй г)гзи от(сопи! СЬ р, яге гуре!= О) совки! яге гуре 3тй()гя1 ог (СЬ с, яге гуре г' = 0) сопя; )поиск последнего символа (любого), входящего в аргумент:, яге курвой !аз! о5 (сопя! ьаяс яппйа я, з!ге гуре г' = проз) сопзг; яге гурецкий !аз! о)'(соля1 сь* р, яге суре г', яге гуре и) сопя; яге гуре!)лй !азг ог(сот! СЬ* р, я!ге (уре1 = проз) сопи; яге гурецкий 1аяг О!'(СЬ с, ипе (уре ! = проз) сот!; У поиск первого символа, не входящего в аргумент: яге гуре!)пй /яз1 ло( ог(солз1 ьаяс ягс(лба з, к)ге гуре! = 0) сот(; яге !урезай )язг по( оу(сопя! сь* р, яге гуре1, з)ге гуре и) сопки! яге гуре!)пй ))сзг пог о((сопз1 СЬ* р, я(ге (уре1 = 0) соля1; яге гурегйлй /яяг пог о!(СЬ с, з(ге (уре1 = О) сопя(; () поиск последнего символа, не входящего в аргумент: яге гуреуипй 1аз( пог от(соли! Ьаяс я!паба з, яге (уре1 = проз) сопя, яге гуре!)пй 1азг пог о!'(сопя! сь р, яке гуре!, я(ге (уре п) соня; яге гуре!)пй 1азг пог о!'(сопз1 сь*р, з!ге ~ре ! = прок) сот!; яге курвой )аяг по( от(СЬ с, яге (уре1 = прая) соим; Л...
Все это константные функции-члены. Они предназначены для локализации искомой строки, но с их помощью нельзя изменить исходную строку. Смысл и назначение функций Ьаяс иптлб::ЯлйО можно понять, сравнив их с аналогичными стандартными алгоритмами. Рассмотрим пример; ио(й!'( ) ( згг)л8 з = "ассйсйе"; Глава 20. Строки 706 з(2)=='с'&&1(З) =='й' з(4) =='с'&&в(5) =='й' з(!)== с з(5)=='й' з)0)1='с'&&1(0)(= УР з(6)! ='с'&&1(6) 1='й' я ге 1уре 11 = з . ((пй ( "сй" ); в<ге 1уре!2 = з.(у(пй("сй") < з(ге (уре <3 = 1.1(пй ((гз< о(("сй") ( <йге <уре 14 = 1.1(пй 1ая о(("сй") ( зпе (уре(5 = з.!)пй ()гз< по1 о(("сй"); з(ге (уре <6 = з.!(пй !аз( ло( о(("сй") ( У!<1 = 2 УУ!2 = 4 УУ<З = 1 УУ(4 = 5 УУ(5 = 0 У)<6 = 6 з<с(пе з<г(ле з<г(пе з<с(ле з<г(ле з<г(пе ) Если функция)1ий() ничего не находит, она возвращает проз, что означает недопустимую позицию символа.
Применение проз в качестве позиции символа вызывает генерацию исключения оп< о( галие (В20.3.5). Отметим, что возврат)<ий() есть число беззнаковое. 20.3.12. Замена После того как позиция символа в строке определена, значения индивидуальных символов можно изменить при помощи операции индексирования, или можно заменить целую подстроку новыми символами при помощи функции гер(осе (): <етр!а<е<с1азз СЬ, с1ая Зг = слог оааз<СЬ>, с!азз А = а((оса<ог<СЬ» с(азз Ьазк з<г(па ( риЬ(1с: УУ ., УУ замена ((*(Ь!з)(<),(*(Ь<з)(<' и)( другими символами: Ьаяс з(пиеа гер!асе(яге <уре1, з(ге (уре и, сопл< Ьазк з(пиеа з) ( Ьаяс в<с<лез гер(осе(яге <уре <, яге (уре и, солз(Ьазк з<г!пав з, 11ге ~ре <2, яге (уре п2) ( Ьаяс з<г(пеь гер(осе(яге <уре <, в<ге <уре и, сопл(СЬ* р, яге (уре п2) Ьазк з<г(пеа гер(асе (з!ге <уре (', в<ге <уре и, сопл< СЬ* р) ( Ьаз!с аппда гер(осе (яге <уре 1, яге (уре п, яге (уре п2, СЬ с) < Ьаяс в<(<лез гер(осе(Вега<о((', ((ега(ог 12, сопя Ьаяс в<пиеа з) ( Ьаяс з<г!пег гер(осе(Вега(ог1, «ега<ог 12, сопя СЬ* р, яге <уре и); Ьаяс в<(<пав гер!осе(иега<ог (', аега(ог (2, соил< СЬ* р); Ьазк в<(<лез гер(осе(аега(ог (', Вега(ог 12, яге <уре и, СЬ с); <етр(а(е<с(азз!п> Ьаяс з<г!пеь гер!осе(!<его<о( (', аега(ог (2, 1п), 1п)2) У)удаление символов из строки ( замена ничем"); Ьаяс в<пиеа егазе(яге <уре (' = О, з(ге (уре и = проз) 1(ега(ог егазе (!1ега<ог 1); 1(ега<ог егазе (аега<ог()гя, 1(ега(ог <аз<) < го(й с(еаг (); УУ ...
)( УУ удаллет все символы Отметим, что число новых символов может не совпадать с числом символов подстроки. Размер строки изменяется твк, чтобы соответствовать новому содержимому подстроки. В частности, егазе () просто удаляет подстроку и соответственно изменяет размер строки. Например: 707 20.3. Стандартный строковый шаблон )>аз(с з(г(по гоЩ'( ) ( я<пня з = "Ьи< 1 йоге йеап( 1( (гогйз егеи 1/ уои дои ' ( ЬеИеге <п В" ( я. егаяе (О, 4) ( //удоллем начальное 'Ьш " я. гер1асе (з.]1пд( "егеп" ), 4, "оп1у" ) ( з.гер1асе(я.1(пд("((оп'<"),5, "") ( //удаляем с заменой на "" Как и вызов с1еагО, вызов егаяе() без аргументов просто превращает любую строку в пустую строку. Набор функций гер1асе() соответствует таковому для функций присваивания. В конце концов, гер!асс () — это присваивание нового значения подстроке. 20.3.13.
Подстроки Функция зийз(г() позволяет задать подстроку, указав начальную позицию и длину; (егор!а<е<с!ат СЬ, с1ат Тг = сйаг (га(т<СЬ>, с1аяя А = нИоса(ог<СЬ» с!аяз Ьаз(с з(г(ие ( риЬ|с< // ... // адрес лодел(рокк Ьаяс я(г(ла яиЬз(г(яяе (уре < = О, я(е (уре и = проз) соля<( // ...
Функция яиЬя(г() — это способ прочитать часть строки. С другой стороны, функция гер1асе () позволяет выполнять запись в подстроку. Обе функции нуждаются в задании позиции (низкоуровневой) символа плюс число символов. В то же время](п(1() позволяет находить подстроки по их значениям. Вместе они позволяют нам находить подстроки, которые можно применять как для чтения, так и для записи: <еяр!а(е<с!азя Сй> с(ат Вояк яиЬя(ппл ( рий!(с: <уреде((урепате баас я<г(на<СЬ>::яге <уре яге <уре; Вазк вийя(г(пя(Ьаяс я(г(иа<СЬ>а з, з(зе (уре(', я(е <уре н) ( //я1!]..з]((н-1] Вояк вийя<((иа(Ьаяс ягшя<Сй>а з, соля Ьаз(с з(г(ие<СЬ>а я2) ( //з2 вз Ваяс вийя<((пе (Ьаяс я(ппа<СЬ>я з, сопя< Сй* р); //*р в( Ваяв зийя1пие орега(ог=(солт Ьаз(с з(пиа<СЬ>ь) ( Ваяс вийя<пни орега(ог= (сопи! Ваяс вийя<с(пе<Сй>а) Ваз(с вийя(г(ие орега(ог= (соня< Сй*); Ваяс яиЬза(ие орега(ог= (Сй) ( орега(ог Ьаяс з<г<ие<СЬ> () сопя< орега(ог соля Сй* () соня(( рпга<е < Ьаяс тплл<СЬ>* рт Глава 20.
Строки 7ОВ з(ге (уре рот яге (уре и( )( Реализация весьма тривиальна. Например: (етрйие<с(азз Сй> Виз(с яийяп4пе<СЬ>::Вая!с яийяитпд(йая!с яизпе<СЬ>г з, сопя Ьаяс я<ппд<СЬ>ь з2) : рз(ая), п(я2.1еп8(й Н ) ( ,иоя = я./!п<((з2) ( ) (етр(а(е<с(азз Сй> Воз(с яиймппд<СЬ>а Ваяс яиЬз(ппд<СЬ> <:прего(ог= (сопя(Ьаяс яппд<СЬ>г з) ( рз->«ерй<се (роя, и, з) ( геиип *(ЬВ< ) <етр1а(е<с!азя Сй> Ваяс яийзитпд<СЬ>:;орега(ог Ьая!с зитпд<СЬ> () сопя( ( гетгп Ьая(с яппд<СЬ> (*рз, роз, и) < ) Естественно, было бы еше интереснее, если бы Вийя(«(пд искал бы подстроки по шаблонному образцу (820.6[7)).