Язык программирования C++. Вводный курс


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


/p>

}

Этот фрагмент программы выводит такую строку:

Number of words greater than length six are 22

Алгоритм remove()

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

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;

<


Начало  Назад  Вперед