|
Программирование >> Разработка устойчивых систем
Алгоритмы подробно рассматриваются в главе 6. const stnngS from, const strings to); #endif REPLACEALL H /:- : C03:ReplaceAll.cpp {0} #incl ude <cstddef> #include ReplaceAll.h using namespace std; strings replaceAlК strings context, const strings from, const strings to) { size t lookHere = 0; size t foundHere; while ((foundHere = context.find(from. lookHere)) != string::npos) { context.replace(foundHere. from.sizeO. to); lookHere = foundHere + to.sizeO; return context; } III:- Версия find(), использованная в этой программе, получает во втором аргументе начальную позицию поиска, и возвращает string::npos. Позицию, хранящуюся в переменной lookHere, важно сместить за строку замены на тот случай, если from является подстрокой to. Следующая программа предназначена для тестирования функции гер1асеА11(): : СОЗ:ReplaceAllTest.срр {L} ReplaceAll #include <cassert> #include <iostream> #include <string> #include ReplaceAll.h using namespace std: int mainO { string text = a man. a plan, a canal, panama ; replaceAlKtext, an , XXX ): assert(text == a mXXX, a piXXX, a cXXXal. pXXXama ); } III:- Как видите, класс string сам по себе не рещает все возможные задачи - во многих решениях приходится привлекать алгоритмы стандартной библиотеки, поскольку loiacc string может рассматриваться как контейнер STL (для чего используются итераторы, о которых говорилось выше). Все общие алгоритмы работают с интервалами элементов, хранящихся в контейнерах. Чаще всего используются интервалы от начала до конца контейнера . Объект string интерпретируется как контейнер с элементами-символами; начало интервала определяется итератором string::begin(), а конец интервала - итератором string::end(). Следующий пример демонстрирует применение алгоритма гер1асе() для замены всех вхождений символа X символом Y : : C03:StringCharReplace.cpp #include <algorithm> #include <cassert> #include <string> Поиск в строках Функции группы find класса string предназначены для поиска символа или группы символов в заданной строке. Ниже перечислены функции группы find и область их применения. using namespace std: int mainO { string sCaaaXaaaXXaaXXXaXXXXaaa ): replace(s.begin(). s.endO. X, Y): assertCs == aaaYaaaYYaaYYYaYYYYaaa ): } /:- Обратите внимание: алгоритм replace() вызывается не как функция класса string(). Кроме того, в отличие от функций string::replace(), выполняющих только одну замену, алгоритм гер1асе() заменяет все вхождения одного символа другим символом. Алгоритм гер1асе() работает только с отдельными объектами (в данном случае - с объектами char), он не может использоваться для замены символьных массивов или объектов string. Поскольку объект string ведет себя как контейнер STL, к нему могут применяться и другие алгоритмы. Это позволяет решать задачи, не решаемые напрямую функциями класса string. Конкатенация с использованием перегруженных операторов Многих программистов С при знакомстве с классом string языка С++ приятно удивляет простота объединения объектов string операторами + и +=. При использовании этих операторов синтаксис конкатенации строк напоминает суммирование числовых данных: : C03:AddStrings.cpp #include <string> #include <cassert> using namespace std: int mainO { string si( This ): string s2( That ): string s3( The other ): Конкатенация строк оператором + si = si + s2: assert(sl == This That ): Другой способ конкатенации строк si += S3: assert(sl == This That The other ): В правой части может производиться индексирование строки si += S3 + s3[4] + ooh lala : assert(sl == This That The other The other oooh lala ): } /:- Операторы + и += обеспечивают гибкие и удобные средства для объединения строковых данных. В правой части оператора может использоваться практически любой тип, интерпретируемый как один или несколько символов. using std using std using std :size t: :sqrt: : string: class SieveTest : public TestSuite::Test { findO Ищет в строке заданный символ или группу символов. Возвращает начальную позицию первого найденного экземпляра или npos при отсутствии совпадений. f1nd first of() Ищет в строке и возвращает позицию первого символа, совпадающего с любым символом из заданной группы. При отсутствии совпадений возвращается npos. f1nd last of() Ищет в строке и возвращает позицию последнего символа, совпадающего с любым символом из заданной группы. При отсутствии совпадений возвращается npos. find first not of() Ищет в строке и возвращает позицию первого элемента, не совпадающего ни с одним из символов заданной группы. При отсутствии совпадений возвращается npos. f1ndJast not of() Ищет в строке и возвращает позицию последнего элемента, не совпадающего ни с одним из символов заданной группы. При отсутствии совпадений возвращается npos. rfindO Просматривает строку от конца к началу в поисках заданного символа или группы символов и возвращает начальную позицию совпадения. При отсутствии совпадений возвращается npos. Простейщий вариант функции find() ищет в строке один или несколько символов. Перегруженная версия find() получает параметр, определяющий искомый символ (или символы), и необязательный параметр, который указывает, где в строке должен начинаться поиск подстроки (по умолчанию поиск начинается с позиции 0). Вызывая find в цикле, вы можете легко перемещаться по строке и повторять поиск до обнаружения всех вхождений заданного символа или группы символов в строке. Следующая программа использует решето Эратосфена для поиска простых чисел, меньших 50. Этот алгоритм начинает с числа 2, помечает все числа, кратные 2, как непростые, и повторяет процесс для следующего кандидата в простые числа. Конструктор SieveTest инициализирует sieveChars, для чего он задает исходный размер символьного массива и записывает значение Р в каждый из его элементов. : C03:S1eve.h lifndef SIEVE H Idefine SIEVE H #1 nclude <cmath> #1 nclude <cstddef> #1 nclude <str1ng> linclude ../TestSuite/Test.h
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |