В следующем примере две строки содержат названия текущего проекта и проекта, находящегося в отложенном состоянии. Они должны периодически обмениваться значениями, поскольку работа идет то над одним, то над другим. Например:
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"