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

1 ... 181 182 183 [ 184 ] 185 186 187 ... 395


void process vocab( vector<textwords, allocator> *pvec ) {

подсчитать число строк, дина котор больше 6

int cnt = count if( texts.begin(), texts.end(), GreaterThan() );

cout << Number of words greater than length six are << cnt << endl;

...

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

Nuer of words greater than length six are 22

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

void process vocab( vector<textwords, allocator> *pvec ) {

ic string rw[] = { and , if , or ,

:)r< string > remove words( r, ) ;

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

vector< string > remove words( r,

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



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;

PrintElem копирует один элемент в стандартный вывод:

void process vocab( vector<textwords, allocator> *pvec ) {

...

for each( texts.begin(), texts.end(), PrintElem() );

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

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



#include <vector> #include <string> #include <algorithm> #include <iterator>

предшествующий принятию стандарта синтаксис <iostream> #include <iostream.h>

class GreaterThan {

public:

GreaterThan( int size = 6 ) : size( sz ){} int size() { return size; }

bool operator()(const string &s1)

{ return s1.size() > size; }

private:

int size;

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;



1 ... 181 182 183 [ 184 ] 185 186 187 ... 395

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