Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

Message–ID: <5678.21–Nov–1997@example.com>

Hi everyone.

––––

To: "Mary Smith: Personal Account" <smith@home.example>

From: John Doe <jdoe@machine.example>

Subject: Re: Saying Hello

Date: Fri, 21 Nov 1997 11:00:00 –0600

Message–ID: <abcd.1234@local.machine.tld>

In–Reply–To: <3456@example.net>

References: <1234@local.machine.example> <3456@example.net>

This is a reply to your reply.

––––

––––

По существу, мы сократили файл, отбросив большинство информации и облегчив анализ, завершив каждое сообщение строкой, содержащей символы –––– (четыре пунктирные линии). Мы собираемся написать “игрушечное приложение”, которое будет искать все сообщения, посланные отправителем John Doe, и выводить на экран их тему под рубрикой “Subject”. Если мы сможем это сделать, то научимся делать много интересных вещей.

Во-первых, мы должны решить, хотим ли мы иметь произвольный доступ к данным или анализировать их как входные потоки. Мы выбрали первый вариант, поскольку в реальной программе нас, вероятно, интересовали бы несколько отправителей или несколько фрагментов информации, поступившей от конкретного отправителя. Кроме того, эту задачу решить труднее, поэтому нам придется проявить больше мастерства. В частности, мы снова применим итераторы.

Наша основная идея — считать весь почтовый файл в структуру, которую мы назовем

Mail_file
. Эта структура будет хранить все строки почтового файла (в объекте класса
vector<string>
) и индикаторы начала и конца каждого отдельного сообщения (в объекте класса
vector<Message>
).

Для этого мы добавим итераторы, а также функции

begin
и
end
, чтобы иметь возможность перемещаться по строкам и сообщениям, как обычно. Эта схема обеспечит нам удобный доступ к сообщениям. Имея такой инструмент, мы напишем наше “игрушечное приложение”, позволяющее собирать вместе все сообщения, поступившие от одного и того же адресата, чтобы их было легче найти.

В заключение выведем на экран все темы сообщений, поступивших от John Doe, чтобы проиллюстрировать созданный нами механизм доступа к структурам. Мы используем для этого основные средства стандартной библиотеки.

#include<string>

#include<vector>

#include<map>

#include<fstream>

#include<iostream>

using namespace std;

Определим класс

Message
как пару итераторов в классе
vector<string>
(наш вектор строк).

typedef vector<string>::const_iterator Line_iter;

class Message { // объект класса Message ссылается

// на первую и последнюю строки сообщения

Line_iter first;

Line_iter last;

public:

Message(Line_iter p1, Line_iter p2) :first(p1), last(p2) { }

Line_iter begin const { return first; }

Line_iter end const { return last; }

// ...

};

Определим класс

Mail_file
как структуру, содержащую строки текста и сообщения.

typedef vector<Message>::const_iterator Mess_iter;

struct Mail_file { // объект класса Mail_file содержит все строки

// из файла и упрощает доступ к сообщениям

string name; // имя файла

vector<string> lines; // строки по порядку

vector<Message> m; // сообщения по порядку

Mail_file(const string& n); // считываем файл n в строки

Mess_iter begin const { return m.begin; }

Mess_iter end const { return m.end; }

};

Отметьте, что мы добавили в структуры данных итераторы, чтобы иметь возможность систематически перемещаться по структуре. На самом деле мы не собираемся использовать здесь стандартные библиотечные алгоритмы, но если захотим, то итераторы позволят нам сделать это.

  • Читать дальше
  • 1
  • ...
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: