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

1 ... 86 87 88 [ 89 ] 90 91 92 ... 395


возвращаемое значение - указатель на строков вектор vector<string,allocator>* retrieve text() {

string file name;

cout << please enter file name: ; cin >> file name;

откроем файл для ввода ...

ifstream 1nfile( file name.c str(), ios::in );

if ( ! infile ) {

cerr << oops! unable to open file

<< file name << - bailing out!\n ;

exit( -1 );

else cout << \n;

vector<string, allocator> *1ines of text =

new vector<string, allocator>; string textime;

typedef pair<string::size type, int> stats; stats maxline; int linenum = 0;

while ( getline( infile, textline, \n )) { cout << line read: << textline << \n;

if ( maxline.first < textline.size() ) { maxline.first = textline.size() ; maxline.second = linenum;

1ines of text->push back( textline ); linenum++;

return lines of text;

Вот как выглядит вывод программы (размер страницы книги недостаточен, чтобы расположить напечатанные строки во всю длину, поэтому мы сделали в тексте отступы, показывающие, где реально заканчивалась строка):

please enter file name: a1ice emma

line read: Alice Ea has long flowing red hair. Her Daddy says line read: when the wind blows through her hair, it looks almost alive,

line read: like a fiery bird in flight. A beautiful fiery bird,

he tells her,

line read: magical but untamed. Daddy, shush, there is no such thing,

line read: she tells him, at the same time wanting him to tell her more.

line read: Shyly, she asks, I mean. Daddy, is there?

number of lines: 6 maximum length: 66

longest line: like a fiery bird in flight. A beautiful fiery bird, he tells her,



For every tale theres a telling,

and thats the he and she of it.

В приведенном фрагменте есть следующие знаки препинания:


А хотелось бы получить:


Можно возразить, что

theres

должно превратиться в

[ there is ~

но мы-то движемся в другом направлении: следующий шаг - это отбрасывание семантически нейтральных слов, таких, как is, that, and, it и т. д. Так что для данной строчки из Finnegans Wake только два слова являются значимыми: tale и telling, и только по этим словам будет выполняться поиск. (Мы реализуем набор стоп-слов с помощью контейнерного типа set, который подробно рассматривается в следующем разделе.)

После удаления знаков препинания нам необходимо превратить все прописные буквы в строчные, чтобы избежать проблем с поиском в таких, например, строках:

the heart

Home is where

A home is where they have to let you in.

Несомненно, запрос слова home должен найти обе строки.

Мы должны также обеспечить минимальную поддержку учета словоформ: отбрасывать окончания слов, чтобы слова dog и dogs, love, loving и loved рассматривались системой как одинаковые.

После того как все строки текста сохранены, нужно разбить их на слова. Сначала мы отбросим знаки препинания. Например, возьмем строку из части Anna Livia Plurrabelle романа Finnegans Wake .



#include <string> #include <iostream>

int main() {

string name( AnnaBelle ); int pos = name.find( Anna ); if ( pos == string::npos )

cout << AAnna не найдено !\n ; else cout << AAnna найдено в позиции: << pos << endl;

Например:

Хотя позиция подстроки почти всегда имеет тип int, более правильное и переносимое объявление типа результата, возвращаемого find() , таково:

string::size type Например:

string::size type pos = name.find( Anna );

Функция find() делает не совсем то, что нам надо. Требуемая функциональность обеспечивается функцией find first of() , которая возвращает позицию первого символа, соответствующего одному из заданных в строке-параметре. Вот как найти первый символ, являющийся цифрой:

В следующем разделе м1 вернемся к описанию стандартного класса string и рассмотрим многочисленные операции над строками, которые он поддерживает, в контексте дальнейшей разработки нашей поисковой системы.

6.8. Выделяем слова в строке

Нашей первой задачей является разбиение строки на слова. М1 будем вычленять слова, находя разделяющие их пробелы с помощью функции find(). Например, в строке

i Alice Ea has long flowing red hair.

насчитывается шесть пробелов, следовательно, эта строка содержит семь слов.

Класс string имеет несколько функций поиска. find() - наиболее простая из них. Она ищет образец, заданный как параметр, и возвращает позицию его первого символа в строке, если он найден, или специальное значение string::npos в противном случае.



1 ... 86 87 88 [ 89 ] 90 91 92 ... 395

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