Программирование >>  Инициализация объектов класса, структура 

1 ... 343 344 345 [ 346 ] 347 348 349 ... 395


#include <iostream.h> #include <string>

int main() {

string buf, largest;

для хранения статистики

int curLen, дина текущего слова

max = -1, максимальная длина слова

cnt = 0; счетчик прочитанн слов

while ( cin >> buf )

curLen = buf.size(); ++cnt;

новое самое длинное слово? сохраним его

if ( curLen > max )

= curLen;

max = curLen; largest = buf;

cout << Число прочитаннхх слов << cnt << endl; cout << Длина самого длинного слова << max << endl; cout << Самое длинное слово << largest << endl;

заботится сам string. Вот как выглядит наша программа в данном случае:

Однако запятая и кавычка по-прежнему считаются частью слова. Напишем функцию для

#include <string>

void filter string( string &str ) {

элементы, подлежащие фильтрации string filt elems( \ ,?. ); string::size type pos = 0;

while (( pos = str.find first of( filt elems, pos )) != string::npos ) str.erase( pos, 1 );

удаления этих символов из слова:

Эта функция работает правильно, но множество символов, которые мы собираемся отбрасывать, зашито в код. Лучше дать пользователю возможность самому передать строку, содержащую такие символы. Если он согласен на множество по умолчанию, то может передать пустую строку.

только нулевой символ. До чтения из стандартного ввода дело так и не доходит, программа зацикливается.

При использовании класса string все проблемы управления памятью исчезают, об этом



template <class InputIterator>

void filter string( Inputlterator first, Inputlterator last, string filt elems = string( \ ,. ))

for ( ; first != last; first++ )

string::size type pos = 0;

while (( pos = (*first).find first of( filt elems, pos ))

string::npos

(*first).erase( pos, 1 );

диапазон, где производится фильтрация:

С использованием этой функции программа будет выглядеть так:

#include <string> void filter string( string &str,

string filt elems = string( \ ,. ))

string::size type pos = 0;

while (( pos = str.find first of( filt elems, pos )) != string::npos ) str.erase( pos, 1 );

Более общая версия filter string() принимает пару итераторов, обозначающих



#include <string> #include <algorithm> #include <iterator> #include <vector> #include <iostream>

bool length less( string s1, string s2 )

{ return s1.size() < s2.size(); }

int main() {

istream iterator< string > input( cin ), eos;

vector< string > text; copy - это обобщенный алгоритм

copy( input, eos, back inserter( text ));

string filt elems( \ ,.;: );

filter string( text.begin(), text.end(), filt elems ); int cnt = text.size();

max element - это обобщенный алгоритм

string *max = max element( text.begin(), text.end(), length less );

int len = max->size();

cout << Число прочитанных слов << cnt << endl;

cout << Длина самого длинного слова << len << endl;

cout << Самое длинное слово << *max << endl;

Когда мы применили в алгоритме max element() стандартный оператор меньше , определенный в классе string, то были удивлены полученным результатом:

Число прочитанных слов 65 Длина самого длинного слова 4 Самое длинное слово wind

Очевидно, что wind - это не самое длинное слово. Оказывается, оператор меньше в классе string сравнивает строки не но длине, а в лексикографическом порядке. И в этом смысле wind - действительно максимальный элемент. Для того чтобы найти слово максимальной длины, мы должны заменить оператор меньше предикатом length less (). Тогда результат будет таким:

Число прочитанных слов 65 Длина самого длинного слова 9 Самое длинное слово beautifUl

Упражнение 20.2



1 ... 343 344 345 [ 346 ] 347 348 349 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика