С++ для начинающих



         

Использование обобщенных алгоритмов


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

  • Создать копию каждого вектора.
  • Слить все векторы в один.
  • Отсортировать его в алфавитном порядке.
  • Удалить все дубликаты.
  • Снова отсортировать, но уже по длине слов.
  • Подсчитать число слов, длина которых больше шести знаков (предполагается, что длина– это некоторая мера сложности, по крайней мере, в терминах словаря).
  • Удалить семантически нейтральные слова (например, союзы and (и), if (если), or (или), but (но) и т.д.).
  • Напечатать получившийся вектор.
  • На первый взгляд, задача на целую главу. Но с помощью обобщенных алгоритмов мы решим ее в рамках одного подраздела.

    Аргументом нашей функции является вектор из векторов строк. Мы принимаем указатель на него, проверяя, не является ли он нулевым:

    #include <vector>

    #include <string>

    typedef vector<string, allocator> textwords;

    void process_vocab( vector<textwords, allocator> *pvec )

    {

       if ( ! pvec ) {

          // выдать предупредительное сообщение

          return;

       }

       // ...

    }

    Нужно создать один вектор, включающий все элементы исходных векторов. Это делается с помощью обобщенного алгоритма copy() (для его использования необходимо включить заголовочные файлы algorithm и iterator):

    #include <algorithm>

    #include <iterator>

    void process_vocab( vector<textwords, allocator> *pvec )

    {

       // ...

       vector< string > texts;

       vector<textwords, allocator>::iterator iter = pvec->begin();

       for ( ; iter != pvec->end(); ++iter )

          copy( (*iter).begin(), (*iter).end(), back_inserter( texts ));

       // ...

    }

    Первыми двумя аргументами алгоритма copy() являются итераторы, ограничивающие диапазон подлежащих копированию элементов. Третий аргумент – это итератор, указывающий на место, куда надо копировать элементы. back_inserter называется адаптером итератора; он позволяет вставлять элементы в конец вектора, переданного ему в качестве аргумента. (Подробнее мы рассмотрим адаптеры итераторов в разделе 12.4.).




    Содержание  Назад  Вперед