++word_pos; prev_pos = ++pos;
}
// обработаем последнее слово
words-push_back(
textline.substr( prev_pos, pos - prev_pos ));
locations-push_back(
make_pair( line_pos, word_pos ));
}
return new text_loc( words, locations );
}
Теперь функция main()выглядит следующим образом:
int main()
{
vectorstring *text_file = retrieve_text();
text_loc *text_locations = separate_words( text_file );
// ...
}
Вот часть распечатки, выданной тестовой версией separate_words():
textline: Alice Emma has long flowing red hair. Her Daddy
says
eoclass="underline" 52 pos: 5 line: 0 word: 0 substring: Alice
eoclass="underline" 52 pos: 10 line: 0 word: 1 substring: Emma
eoclass="underline" 52 pos: 14 line: 0 word: 2 substring: has
eoclass="underline" 52 pos: 19 line: 0 word: 3 substring: long
eoclass="underline" 52 pos: 27 line: 0 word: 4 substring: flowing
eoclass="underline" 52 pos: 31 line: 0 word: 5 substring: red
eoclass="underline" 52 pos: 37 line: 0 word: 6 substring: hair.
eoclass="underline" 52 pos: 41 line: 0 word: 7 substring: Her
eoclass="underline" 52 pos: 47 line: 0 word: 8 substring: Daddy
last word on line substring: says
...
textline: magical but untamed. "Daddy, shush, there is no
such thing,"
eoclass="underline" 60 pos: 7 line: 3 word: 0 substring: magical
eoclass="underline" 60 pos: 11 line: 3 word: 1 substring: but
eoclass="underline" 60 pos: 20 line: 3 word: 2 substring: untamed
eoclass="underline" 60 pos: 28 line: 3 word: 3 substring: "Daddy,
eoclass="underline" 60 pos: 35 line: 3 word: 4 substring: shush,
eoclass="underline" 60 pos: 41 line: 3 word: 5 substring: there
eoclass="underline" 60 pos: 44 line: 3 word: 6 substring: is
eoclass="underline" 60 pos: 47 line: 3 word: 7 substring: no
eoclass="underline" 60 pos: 52 line: 3 word: 8 substring: such
last word on line substring: thing,":
...
textline: Shy1y, she asks, "I mean, Daddy: is there?"
eoclass="underline" 43 pos: 6 line: 5 word: 0 substring: Shyly,
eoclass="underline" 43 pos: 10 line: 5 word: 1 substring: she
eoclass="underline" 43 pos: 16 line: 5 word: 2 substring: asks,
eoclass="underline" 43 pos: 19 line: 5 word: 3 substring: "I
eoclass="underline" 43 pos: 25 line: 5 word: 4 substring: mean,
eoclass="underline" 43 pos: 32 line: 5 word: 5 substring: Daddy,
eoclass="underline" 43 pos: 35 line: 5 word: 6 substring: is
last word on line substring: there?":
Прежде чем продолжить реализацию поисковой системы, вкратце рассмотрим оставшиеся функции-члены класса string, предназначенные для поиска. Функция rfind() ищет последнее, т.е. самое правое, вхождение указанной подстроки:
string river( "Mississippi" );
string::size_type first_pos = river.find( "is" );
string::size_type 1ast_pos = river.rfind( "is" );
find() вернет 1, указывая позицию первого вхождения подстроки "is", а rfind() – 4 (позиция последнего вхождения "is").
find_first_not_of() ищет первый символ, не содержащийся в строке, переданной как параметр. Например, чтобы найти первый символ, не являющийся цифрой, можно написать:
string elems( "0123456789" );
string dept_code( "03714p3" );
// возвращается позиция символа 'p'
string::size_type pos = dept_code.find_first_not_of(elems) ;
find_last_of() ищет последнее вхождение одного из указанных символов. find_last_not_of() – последний символ, не совпадающий ни с одним из заданных. Все эти функции имеют второй необязательный параметр – позицию в исходной строке, с которой начинается поиск.
Напишите программу, которая ищет в строке
"ab2c3d7R4E6"
цифры, а затем буквы, используя сначала find_first_of(), а потом find_first_not_of().
Напишите программу, которая подсчитывает все слова и определяет самое длинное и самое короткое из них в строке sentence:
string linel = "We were her pride of 10 she named us --";
string line2 = "Benjamin, Phoenix, the Prodigal"
string line3 = "and perspicacious pacific Suzanne";
string sentence = linel + line2 + line3;
Если несколько слов имеют длину, равную максимальной или минимальной, учтите их все.
6.9. Обрабатываем знаки препинания
После того как мы разбили каждую строку на слова, необходимо избавиться от знаков препинания. Пока из строки
magical but untamed. "Daddy, shush, there is no such thing,"
у нас получился такой набор слов:
magical
but
untamed.
"Daddy,
shush,
there
is
no
such
thing,"
Как нам теперь удалить ненужные знаки препинания? Для начала определим строку, содержащую все символы, которые мы хотим удалить:
string filt_elems( "\",.;:!?)(\\/" );
(Обратная косая черта указывает на то, что следующий за ней символ должен в данном контексте восприниматься буквально, а не как специальная величина. Так, \" обозначает символ двойной кавычки, а не конец строки, а \\ – символ обратной косой черты.)
Теперь можно применить функцию-член find_first_of() для поиска всех вхождений нежелательных символов:
while (( pos = word.find_first_of( filt_elems, pos ))
!= string::npos )
Найденный символ удаляется с помощью функции-члена erase():