sentence.replace( position+2, 1, new_str, posT, 4 );
// нашли: заменим D на "Data "
sentence.replace( position+1, 1, new_str, posD, 5 );
// нашли: заменим A на "Abstract "
sentence.replace( position, 1, new_str, posA, 9 );
Еще один вариант позволяет заменить подстроку на один символ, повторенный заданное количество раз:
string hmm( "Some celebrate Java as the successor to C++." );
string:: size_type position = hmm.find( 'J' );
// заменим Java на xxxx
hmm.repiace( position, 4, 'x', 4 );
В данном примере используется указатель на символьный массив и длина вставляемой подстроки:
const char *lang = "EiffelAda95JavaModula3";
int index[] = { 0, 6, 11, 15, 22 };
string ahhem(
"C++ is the language for today's power programmers." );
ahhem.replace(0, 3, lang+index[1], index[2]-index[1]);
А здесь мы используем пару итераторов:
string sentence(
"An ADT provides both interface and implementation." );
// указывает на 'A' в ADT
string: iterator start = sentence. begin()+3;
// заменяем ADT на Abstract Data Type
sentence.repiace( start, start+3, "Abstract Data Type" );
Оставшиеся четыре варианта допускают задание заменяющей строки как объекта типа string, символа, повторяющегося N раз, пары итераторов и C-строки.
Вот и все, что мы хотели сказать об операциях со строками. Для более полной информации обращайтесь к определению стандарта С++ [ISO-C++97].
Напишите программу, которая с помощью функций-членов assign() и append() из строк
string quote1( "When lilacs last in the dooryard bloom'd" );
string quote2( "The child "is father of the man" );
составит предложение
"The child is in the dooryard"
Напишите функцию:
string generate_salutation( string generic1,
string lastname,
string generic2,
string::size_type pos,
int length );
которая в строке
string generic1( "Dear Ms Daisy:" );
заменяет Daisy и Ms (миссис). Вместо Daisy подставляется параметр lastname, а вместо Ms подстрока
string generic2( "MrsMsMissPeople" );
длины length, начинающаяся с pos.
Например, вызов
string lastName( "AnnaP" );
string greetings =
generate_salutation( generici, lastName, generic2, 5, 4 );
вернет строку:
Dear Miss AnnaP:
6.12. Строим отображение позиций слов
В этом разделе мы построим отображение (map), позволяющее для каждого уникального слова текста сохранить номера строк и колонок, в которых оно встречается. (В следующем разделе мы изучим ассоциативный контейнер set.) В общем случае контейнер set полезен, если мы хотим знать, содержится ли определенный элемент в некотором множестве, а map позволяет связать с каждым из них какую-либо величину.
В map хранятся пары ключ/значение. Ключ играет роль индекса для доступа к ассоциированному с ним значению. В нашей программе каждое уникальное слово текста будет служить ключом, а значением станет вектор, содержащий пары (номер строки, номер колонки). Для доступа применяется оператор взятия индекса. Например:
string query( "pickle" );
vector location *locat;
// возвращается locationvector*, ассоциированный с "pickle"
locat = text_map[ query ];
Ключом здесь является строка, а значение имеет тип locationvector*.
Для использования отображения необходимо включить соответствующий заголовочный файл:
#include map
Какие основные действия производятся над ассоциативными контейнерами? Их заполняют элементами или проверяют на наличие определенного элемента. В следующем подразделе мы покажем, как определить пару ключ/значение и как поместить такие пары в контейнер. Далее мы расскажем, как сформулировать запрос на поиск элемента и извлечь значение, если элемент существует.