Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KPIYaP_OTVET_3.rtf
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
540 Кб
Скачать
☆

Int main () {

vector<const char*> v; // Vector of character strings.

V.Push_back ((char*) "zippy");

V.Push_back ((char*) "motorboy");

print (v);

return 0;

}

3.31

Вспомогательные виды итераторов

  • Обратный итератор - осуществляет доступ к элементам в обратном порядке, чем итератор произвольного доступа или двунаправленный итератор

  • Итератор потока - осуществляется доступ к элементам потока, делятся на итераторы потоков ввода и вывода.

  • Итератор вставки - предназначен для добавления элементов к цепочке объектов

  • Константный итератор - не допускает изменения данных, на которые он ссылается, формируется путём модификации основного итератора.

Примерр итератора потока:

Int main () {

char buffer [100];

int i = 0;

cout << "Please enter a string: ";

istream_iterator<char, ptrdiff_t> s (cin);

while (*s != '\n') buffer[i++] = *s++;

buffer[i] = '\0'; // Null terminate buffer.

cout << "read " << buffer << endl;

return 0;

}

3.31

Функторы

Функтор-класс, в котором определена операторная функция operator().

Существуют унарные и бинарные функторы. Бинарные функторы получают аргументы в порядке (first,second)

Встроенные функторы определены в <functional> и являются шаблонными классами, что требует типизации при использовании.

Встроенные бинарные функторы

  • Plus-сумма(first+second);

  • Minus- разность(first-second);

  • Multiplies- произведение(first*second);

  • Divides- частное от деления(first/second);

  • Modulus-остаток от деления(first/second

  • Equal-to- true если (first==second)

  • Not_equal_to-true если (first!=second)

  • Greater-true если (first>second)

  • Greater-equal-true если (first>=second)

  • Less - true если (first<second)

  • Less_equal - true если (first<=second)

  • Logical_and - true если ((first&&second)==true)

  • Logical_or - true если ((first||second)==true)

Встроенные унарные функторы

  • Logical_not - true если (first==false)

  • Negate - (-false)

#include <iostream>

#include <conio.h>

#include <functional>

#include <algorithm>

#include <vector>

using namespace std;

template<class T>

void show(vector<T> &v, const char *vn)

{

vector<T>::iterator vi;

cout<<vn<<"=";

for(vi=v.begin(); vi!=v.end(); vi++)

cout<<*vi<<" ";

cout<<endl;

}

int main()

{

vector<double> v1,v2;

for(int i=1;i<10;i++) v1.push_back((double)i);

for(int i=1;i<10;i++) v2.push_back((double)i);

show(v1,"v1"); show(v2,"v2");

transform(v1.begin(), v1.end(), v2.begin(), v2.begin(), multiplies<double>());

show(v1,"v1"); show(v2,"v2");

show(v1,"v1");

transform(v1.begin(),v1.end(),v1.begin(),negate<double>());

show(v1,"v1");

fflush(stdin);

getch();

return 0;

}

Создание функторов

Необходимо создать производный класс от базового класса:

template<class Arg, class Result>

struct unary_functiom

{

typedef Arg argument_type;

typedef Result result_type;

};

template<class Arg1,class Arg2,class Result>

struct binary_function

{

typedef Arg1 first_argument_type;

typedef Arg2 second_argument_type;

typedef Result result_type;

};

Затем в полученном классе требуется перегрузить функцию operator()

#include <iostream>

#include <conio.h>

#include <functional>

#include <algorithm>

#include <vector>

using namespace std;

template<class T>

class myfunctor:binary_function<T,T,T>

{

public:

result_type operator()(first_argument_type f,second_argument_type s)

{

if(f>s) return (result_type)(s/f);

return (result_type)(f/s);

}

};

template<class T>

void show(vector<T> &v, const char *vn)

{

vector<T>::iterator vi;

cout<<vn<<"=";

for(vi=v.begin(); vi!=v.end(); vi++)

cout<<*vi<<" ";

cout<<endl;

}

int main()

{

vector<double> v1,v2;

for(int i=1;i<10;i++) v1.push_back(1.0+rand()%20);

for(int i=1;i<10;i++) v2.push_back(1.0+rand()%20);

show(v1,"v1"); show(v2,"v2");

transform(v1.begin(),v1.end(),v2.begin(),v2.begin(),myfunctor<double>());

show(v1,"v1"); show(v2,"v2");

fflush(stdin);

getch();

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]