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




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


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

{

   // ...

   static string rw[] = { "and", "if", "or", "but", "the" };

   vector< string > remove_words( rw, rw+5 );

   vector< string >::iterator it2 = remove_words.begin();

   for ( ; it2 != remove_words.end(); ++it2 ) {

      // просто для демонстрации другой формы count()

            int cnt = count( texts.begin(), texts.end(), *it2 );

      cout << cnt << " instances removed:  "

           << (*it2) << endl;

          

      texts.erase(

           remove(texts.begin(),texts.end(),*it2 ),

           texts.end()

            );

   }

   // ...

}

Результат применения remove():

1 instances removed:  and

0 instances removed:  if

0 instances removed:  or

1 instances removed:  but

1 instances removed:  the

Теперь нам нужно распечатать содержимое вектора. Можно обойти все элементы и вывести каждый по очереди, но, поскольку при этом обобщенные алгоритмы не используются, мы считаем такое решение неподходящим. Вместо этого проиллюстрируем работу алгоритма for_each() для вывода всех элементов вектора. for_each() применяет указатель на функцию или объект-функцию к каждому элементу контейнера из диапазона, ограниченного парой итераторов. В нашем случае объект-функция PrintElem копирует один элемент в стандартный вывод:

class PrintElem {

public:

   PrintElem( int lineLen = 8 )

      : _line_length( lineLen ), _cnt( 0 )

   {}

   void operator()( const string &elem )

   {

      ++_cnt;

      if ( _cnt % _line_length == 0 )

         { cout << '\n'; }

      cout << elem << " ";

   }

private:

   int _line_length;

   int _cnt;

};

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

{

   // ...

   for_each( texts.begin(), texts.end(), PrintElem() );

}

Вот и все. Мы получили законченную программу, для чего пришлось лишь последовательно записать обращения к нескольким обобщенным алгоритмам. Для удобства мы приводим ниже полный листинг вместе с функцией main() для ее тестирования (здесь используются специальные типы итераторов, которые будут обсуждаться только в разделе 12.4). Мы привели текст реально исполнявшегося кода, который не полностью удовлетворяет стандарту C++. В частности, в нашем распоряжении были лишь устаревшие реализации алгоритмов count() и count_if(), которые не возвращают результат, а требуют передачи дополнительного аргумента для вычисленного значения. Кроме того, библиотека iostream отражает предшествующую принятию стандарта реализацию, в которой требуется заголовочный файл iostream.h.




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