Выбрать главу

#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;

};

class LessThan {

public:

bool operator()( const string & s1,

const string & s2 )

{ return s1.size() s2.size();}

};

typedef vector textwords;

void process_vocab( vectortextwords, allocator *pvec )

{

if ( ! pvec ) {

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

return;

}

vector string, allocator texts;

vectortextwords, allocator::iterator iter;

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

copy( (*iter).begin(), (*iter).end(),

back_inserter( texts ));

// отсортировать вектор texts

sort( texts.begin(), texts.end() );

// теперь посмотрим, что получилось

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

cout "\n\n"; // разделить части выведенного текста

// удалить дубликаты

vectorstring, allocator::iterator it;

it = unique( texts.begin(), texts.end() );

texts.erase( it, texts.end() );

// посмотрим, что осталось

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

cout "\n\n";

// отсортировать элементы

// stable_sort сохраняет относительный порядок равных элементов

stable_sort( texts.begin(), texts.end(), LessThan() );

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

cout "\n\n";

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

int cnt = 0;

// устаревшая форма count - в стандарте используется другая

count_if( texts.begin(), texts.end(), GreaterThan(), cnt );

cout "Number of words greater than length six are "

cnt endl;

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

vector string,allocator remove_words( rw, rw+5 );

vector string, allocator ::iterator it2 = remove_words.begin();

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

{

int cnt = 0;

// устаревшая форма count - в стандарте используется другая

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

cout cnt " instances removed: "

(*it2) endl;

texts.erase(

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

texts.end()

);

}

cout "\n\n";

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

}

// difference_type - это тип, с помощью которого можно хранить результат

// вычитания двух итераторов одного и того же контейнера

// - в данном случае вектора строк ...

// обычно это предполагается по умолчанию

typedef vectorstring,allocator::difference_type diff_type;

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

#include fstream.h

main()

{

vectortextwords, allocator sample;

vectorstring,allocator t1, t2;

string t1fn, t2fn;

// запросить у пользователя имена входных файлов ...

// в реальной программе надо бы выполнить проверку

cout "text file #1: " cin t1fn;

cout "text file #2: " cin t2fn;

// открыть файлы

ifstream infile1( t1fn.c_str());

ifstream infile2( t2fn.c_str());

// специальная форма итератора

// обычно diff_type подразумевается по умолчанию ...

istream_iterator string, diff_type input_set1( infile1 ), eos;

istream_iterator string, diff_type input_set2( infile2 );

// специальная форма итератора

copy( input_set1, eos, back_inserter( t1 ));