Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_pz022 (1).doc
Скачиваний:
6
Добавлен:
29.08.2019
Размер:
240 Кб
Скачать
☆

28.Елементи узагальненого програмування. Протеріччя з ооп. Поняття про ітератори та узагальнені алгоритми. Побудова узагальненої функції.

Протиріччя: парадигма ООП змушує інкапсулювати вл-ті і методи, притаманні якимся класам (обьєктам, типам), проте багато алгоритмів (їх ідея) не залежить від типу даних (напр. Сортування,пошук).

Вихід: Узагальнені алгоритми, коротко кажучи, це технологія, яка дозволяє абстректувати алг. від конкретних типів засобами ООП.

П алгоритми

search

for (p=Beg; p!=End; p++) if (*p==Patem)…Ok!

sort

Ітератори – те, що звязує алгоритми і структури даних.

Контейнер – структура даних, яка містить в собі послідовність елементів одного типу.

Ітератор – це узагальнений показжчик на ел-т контейнера, який має властивості:

1) itor ++ перехід до наступного елемента контейнера

  1. * розіменування – перехід від зн-ня покоз­жчика до зн-ня ел-та ко­нтейнера, на який показ­чик показує.

Ітератор-об’єкт-покажчик,за до-помогою якого можна перебира-ти елементи контейнера. Т.я. доступ до контейнера робиться через покажчик,то треба опера-ції для такого покажчика;ітера-тори:++,--,==,!=,*.

Ітератор дає універсальний дос-туп до першого об’єкта і до ос-таннього елемента.Коли задаєть-ся діапазон через стандартний ітератор,то end вказує на позаос-танній елемент(уявний).

29.Елементи узагальненого програмування. Контейнерно-ітераторна модель на основі поліморфізму.

Інтрузивний контейнер – це контейнер всі ел-ти якого мають типи, що є похідними від одного базового типу.

int sum (Iter *beg, Iter *end)

{Iter *i=beg;

int s-0;

for ( ; (*i)!=(*end); (*i)++) s+= **i

}

При розіменуванні іт-ра не відомо наперед який тип ел-та ко-ра мусить розглядатися.

class Iter

{protected:

void *curr;

virtual

void operator ++(int){}

virtual

int operator *(){}

virtual

int operator !=(Iter i)

};

class List

{struct ListElem

{ListElem *next;}

Tobject *item;

ListElem *head;

Public:

…

friend class ListIter

};

class ListIter: public Iter

{public:

void operator ++(int x)

{curr=((ListElem*)

curr)->next;

}

int operator *()

{return ((ListElem)

curr)->item;

}

int operator != (Item i)

{return curr != i.curr;}

}

class Tobject

{public:

virtual

snt operator *()=0;}

class MyInt1: public Tobject

{int i;

public:

int operator *()

{return i;}

};

class MyInt2: public Tobject

{int i1, i2;

public:

int operator *()

{return i1+i2;}

};

void main()

{vector v(10);

for (int i=0; i,10;i++) v[i]=i;

int sv=sum(&v.Beg(),&v.End());

List L;

for (i=0;s,10;s++) L.insert(i);

int sl=sum(&L.beg(),&L.end());

cout<<…<<sl<<endl;

}

30.Елементи узагальненого програмування. Контейнерно-ітераторна модель на основі шаблонних класів та шаблонних функцій.

31. Елементи узагальненого програмування. Стандартні контейнери та стандартні функції. Алгоритми та об’єкти-ф-ції.

For-each-стандартная ф.

For-each(три параметра:1,2-діа-пазон;3.покажчик на ф.,яка ви-конує цю дію.)

1.Include<algorithm>

For_each(ar,ar+10,PrintElem); //друкуемо елементи контейне-ра.

Void PrintElem (int value)//тип елементів контейнера

Cout<<value<<endl; //чи можна її зробити універсальною.

Template<class InputIterator,class T>

Void for_each (InputIterator first,InputIterator last,void(*f),const T&,value)

{while (first!=last)

f(*first++);}

2.for_each(l.begin(),

l.end,PrintElem);

Наприклад.

Потрібновиконати певні дії,які залежать від елементів, викор. find_if-описуемо шукане значен-ня у вигляді ф.

Find_if(ar,ar+10, BiggerThan1);

Bool BiggerThan1 (int value)

{return value>1;}

3.where ar=find if (ar, ar+10,BiggerThan(n))

//так зробити не можна,тому що викликається ф.,параметр якої обчислюється в процесі її робо-ти.

Цього можна уникнути,якщо:

1.BiggerThan(n)-буде конструктор

2.перевантажити (), тоді BiggerThan повинно бути ек-земпляром кл.,введемо такий кл.

Class c

{bool (*f)(int testval);

int testval;

public: bool(*)()

operator()(int val)

c ( bool (*ff)(int v)):f(ff){}}

Якщо BiggerThan-конструктор , тоді:

Class BiggerThan

{int testvalue;

public:

BiggerThan(int n):testvalue(n) {}

Bool operator()(int val)

{return val>testval(n);}

//треба написати ф.,яка перетво-рює з типу BiggerThaa

operator bool (int)

{return *this;};} //добавимо () і отримаємо ф.

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