В следующем примере две строки содержат названия текущего проекта и проекта, находящегося в отложенном состоянии. Они должны периодически обмениваться значениями, поскольку работа идет то над одним, то над другим. Например:

string current_project( "C++ Primer, 3rd Edition" );

string pending_project( "Fantasia 2000, Firebird segment" );

Функция-член swap() позволяет обменять значения двух строк с помощью вызова

current_project.swap( pending_project );

Для строки

string first_novel( "V" );

операция взятия индекса

char ch = first_novel[ 1 ];

возвратит неопределенное значение: длина строки first_novel равна 1, и единственное правильное значение индекса – 0. Такая операция взятия индекса не обеспечивает проверку правильности параметра, но мы всегда можем сделать это сами с помощью функции-члена size():

int

elem_count( const string word, char elem )

{

int occurs = 0;

// не надо больше проверять ix

for ( int ix=0; ix word.size(); ++-ix )

if ( word[ ix ] == elem )

++occurs;

return occurs;

}

Там, где это невозможно или нежелательно, например:

void

mumble( const string st, int index )

{

// возможна ошибка

char ch = st[ index ];

// ...

}

следует воспользоваться функцией at(), которая делает то же, что и операция взятия индекса, но с проверкой. Если индекс выходит за границу, возбуждается исключение out_of_range:

void

mumble( const string st, int index )

{

try {

char ch = st.at( index );

// ...

}

catch ( std::out_of_range ){...}

// ...

}

Строки можно сравнивать лексикографически. Например:

string cobol_program_crash( "abend" );

string cplus_program_crash( "abort" );

Строка cobol_program_crash лексикографически меньше, чем cplus_program_crash: сопоставление производится по первому отличающемуся символу, а буква e в латинском алфавите идет раньше, чем o. Операция сравнения выполняется функцией-членом compare(). Вызов

sl.compare( s2 );

возвращает одно из трех значений:

* если s1 больше, чем s2, то положительное;

* если s1 меньше, чем s2, то отрицательное;

* если s1 равно s2, то 0.

Например,

cobol_program_crash.compare( cplus_program_crash );

вернет отрицательное значение, а

cplus_program_crash.compare( cobol_program_crash );

положительное. Перегруженные операции сравнения (, , !=, ==, =, =) являются более компактной записью функции compare().

Шесть вариантов функции-члена compare() позволяют выделить сравниваемые подстроки в одном или обоих операндах. (Примеры вызовов приводились в предыдущем разделе.)

Функция-член replace() дает десять способов заменить одну подстроку на другую (их длины не обязаны совпадать). В двух основных формах replace() первые два аргумента задают заменяемую подстроку: в первом варианте в виде начальной позиции и длины, во втором – в виде пары итераторов на ее начало и конец. Вот пример первого варианта:

string sentence(

"An ADT provides both interface and implementation." );

string::size_type position = sentence.find_1ast_of( 'A' );

string::size_type length = 3;

// заменяем ADT на Abstract Data Type

sentence.repiace( position, length, "Abstract Data Type" );

position представляет собой начальную позицию, а length – длину заменяемой подстроки. Третий аргумент является подставляемой строкой. Его можно задать несколькими способами. Допустим, как объект string:

string new_str( "Abstract Data Type" );

sentence.replace( position, length, new_str );

Следующий пример иллюстрирует выделение подстроки в new_str:

#include string

typedef string::size_type size_type;

// найдем позицию трех букв

size_type posA = new_str.find( 'A' );

size_type posD = new_str.find( 'D' );

size_type posT = new_str.find( 'T' );

// нашли: заменим T на "Type"

Перейти на страницу:

Похожие книги