Выбрать главу

)

string_object получает значение "Mississippi Belle". Если мы хотим вставить все символы new_string, начиная с pos, последний параметр нужно опустить.

Пусть есть две строки:

string sl( "Mississippi" );

string s2( "Annabelle" );

Как получить третью строку со значением "Miss Anna"?

Можно использовать функции-члены assign() и append():

string s3;

// скопируем первые 4 символа s1

s3.assign ( s1, 4 );

s3 теперь содержит значение "Miss".

// добавим пробел

s3 += ' ';

Теперь s3 содержит "Miss ".

// добавим 4 первых символа s2

s3.append(s2,4);

s3 получила значение "Miss Anna". То же самое можно сделать короче:

s3.assign(s1,4).append(' ').append(s2,4);

Другая форма функции-члена assign() имеет три параметра: второй обозначает позицию начала, а третий – длину. Позиции нумеруются с 0. Вот как, скажем, извлечь "belle" из "Annabelle":

string beauty;

// присвоим beauty значение "belle"

beauty.assign( s2, 4, 5 );

Вместо этих параметров мы можем использовать пару итераторов:

// присвоим beauty значение "belle"

beauty.assign( s2, s2.begin()+4, s2.end() );

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

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: