Содержание
-
11. Шаблоны классов
1
-
11.1. Контейнеры
Контейнер – хранилище некоторой совокупности данных Операции с контейнером не зависят от типа данных, размещенных в контейнере Пример: стек. Операции со стеком: положить в стек взять из стека 2
-
11.2. Простой шаблон класса
// файл file.h template class Stack{ private: static const int SZ = 100; int top; MyTypearr[SZ]; 3
-
11.2. Простой шаблон класса(продолжение)
public: Stack(); int push(const MyType &); int pop(MyType &); }; template Stack::Stack():top(0){} 4
-
template int Stack::push(const T &el) { if(top
-
template int Stack
::pop(P &el) { if(top > 0){ el = arr[--top]; return 1; } return 0; } 6
-
11.3. Использование шаблона класса
// файл file.cpp #include “file.h” int main() { Stack st1, st2; st1.push(12); // в стеке число 12 st1.push(25); // в стеке число 25 st2 = st1; 7
-
11.3. Использование шаблона класса(продолжение)
int x, y; st1.pop(x); // извлечение числа 25 st1.pop(y); // извлечение числа 12 cout
-
11.4. Вариант 1 шаблона класса
// файл file.h template class Stack{ private: int top; MyTypearr[SZ]; 9
-
11.4. Вариант 1 шаблона класса(продолжение)
public: Stack(); int push(const MyType &); int pop(MyType &); }; template Stack::Stack():top(0){} 10
-
template int Stack::push(const T &el) { if(top
-
template int Stack
::pop(P &el) { if(top > 0){ el = arr[--top]; return 1; } return 0; } 12
-
11.5. Использование шаблона класса
// файл file.cpp #include “file.h” int main() { Stack st1; Stack st2; st1.push(12); // в стеке число 12 st1.push(25); // в стеке число 25 13
-
11.5. Использование шаблона класса(продолжение)
int x, y; st1.pop(x); // извлечение числа 25 st1.pop(y); // извлечение числа 12 cout
-
11.6. Вариант 2 шаблона класса
template class Stack{ private: int top; T *arr; intsz; public: Stack(int = 0); 15
-
11.6. Вариант 2 шаблона класса (продолжение)
int push(const T &); int pop(T &); Stack(const Stack &); ~Stack(){delete [] arr; } Stack &operator =(const Stack &); }; 16
-
template int Stack::push(const T &el) { if(top
-
template int Stack
::pop(P &el) { if(top > 0){ el = arr[--top]; return 1; } return 0; } 18
-
template Stack::Stack(int n):top(0) { sz = n > 0 ? n : 10; arr = new T[sz]; } 19
-
template Stack::Stack(const Stack &s): top(s.top), sz(s.sz), arr(new T[s.sz]) { for(inti = 0; i
-
template Stack &Stack::operator =( const Stack &s) { if(this != &s){ delete [] arr; top = s.top; sz = s.sz; 21
-
arr = new T[sz]; for(inti = 0; i
-
11.7. Использование шаблона класса
int main() { Stack st1, st2; st1.push(12); st1.push(25); st2 =st1; int x, y; st1.pop(x); 23
-
11.7. Использование шаблона класса(продолжение)
st2.pop(y); cout
-
11.8. Контейнер: список
structSLink { SLink *next; SLink(): next(NULL){ } SLink(SLink *p): next(p){ } }; 25 first next next next
-
11.8. Контейнер: список(продолжение)
class BList{ protected: SLink *first; public: BList(): first(NULL){} BList(SLink *a): first(a){} void insert(SLink *); SLink *get(); friend class BListIter; }; 26
-
class BListIter { private: BList *cs; SLink *cl; public: BListIter(BList &a):cs(&a), cl(a.first){} SLink *operator()(); }; 27
-
SLink *BList::get() { SLink *res = first; if(first){ first = first->next; res->next = NULL; } return res; } 28 next next first res
-
void BList::insert(SLink *a) { a->next = first; first = a; a = NULL; } 29 next next a first next
-
SLink *BListIter::operator()() { SLink *ret = cl; cl = cl ? cl->next : cs->first; return ret; } 30
-
11.9. Контейнер: список – использование
class StackInt:public SLink{ protected: intval; public: StackInt(int a = 0):val(a){} intgetVal() const {return val;} }; 31 next val
-
11.9. Контейнер: список – использование (продолжение)
int main() { BListst; StackInt *p = NULL; st.insert(new StackInt(12)); st.insert(new StackInt(25)); st.insert(new StackInt(38)); 32
-
std::cout getVal()) ( st.get() );
-
std::cout (pl); std::cout getVal())
-
p = static_cast(st.get()); std::cout getVal())
-
36 item #3: 38 Iterator: 25 12 item #2: 25 Для продолжения нажмите любую клавишу . . .
-
11.10. Шаблон списка
template structTLink: public SLink{ T info; TLink(const T &a):info(a){ } }; 37
-
11.10. Шаблон списка(продолжение)
template class SListIter; template class SList:privateBList { friend class SListIter; public: void insert(const T &a); T get(); }; 38
-
template void SList::insert(const T &a) { BList::insert(new TLink(a)); } 39
-
template T SList::get() { T res; TLink *lnk = static_cast*>(BList::get()); 40
-
if(lnk){ res = lnk->info; delete lnk; } return res; } 41
-
template class SListIter:publicBListIter{ public: SListIter(SList &a): BListIter(a){ } T *operator()(); }; 42
-
template T *SListIter::operator()() { SLink *p = BListIter::operator()(); return p ? &(static_cast *>(p))->info : NULL; } 43
-
11.11. Использование шаблона списка
int main() { SList st; st.insert(12); st.insert(25); st.insert(38); int res = st.get(); std::cout
-
11.11. Использование шаблона списка(продолжение)
SListIter it(st); int *p = NULL; std::cout
-
std::cout
-
11.12. Структура программы
47 Архивный файл mytempl
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.