Однозв ‘ язні списки з ітераторами •










- Размер: 60 Кб
- Количество слайдов: 9
Описание презентации Однозв ‘ язні списки з ітераторами • по слайдам
Однозв ‘ язні списки з ітераторами • Поняття про патерни • Ітератор — патерн поведінки об ‘ єктів • C труктура ітератора • Int_list : : Ilist_iter • Методи Int_list: : iterator • Позиціювання вузлів ітераторами • Використання ітераторів
Поняття про патерни • Патерн – шаблон проектування (ідея-проф. архітектури С hristofer Alexander) • E. Gamma, R. Helm, R. Johnson, J. Vlissides «Design Patterns: Elements of Reusable Object-Oriented Software» (1995) • C тандартизація – інформації про типову проблему – методах її розв ‘ язання • Шаблони утворення об ‘ єктів Singleton, Builder, Abstract Factory, Factory Method, Prototype • Структурні шаблони Adapter, Bridge, Composite, Decorator, Facade, Proxy. . . • Шаблони поведінки Command, Interpreter, Iterator , Observer, State, Strategy, Visitor. . . • Системні шаблони MVC, Session, Callback, Router, Transaction
Ітератор — патерн поведінки об ‘ єктів Go. F: • Призначення: надає спосіб послідовного доступу до всіх елементів складного об ‘ єкта ( напр. , списку ), не розкриваючи його внутрішньої будови • Мотивація : – за доступ до елементів і обхід відповідає не складний об ‘ єкт, а окремий об ‘ єкт-ітератор – фіксований набір операцій – можливість різних обходів – довільна кількість об ‘ єктів-ітераторів • Учасники: Iterator, Concrete. Iterator, Aggregate, Concrete. Aggregate
C труктура ітератора Concrete. Iterator. Aggregate Create. Iterator() Concrete. Aggregate Create. Iterator() Iterator First() Next() Current. Item()Client
Int_list : : Ilist_iter class Int_list: public List { . . public: class Ilist_iter{ Link * curr; friend Int_list; // розширення інтерфейсу списку void past_element(){ curr+=1; } public: Ilist_iter(): curr(0){} Ilist_iter(const List& l): curr(l. top()){} Ilist_iter(const Ilist_iter& it): curr(it. curr){} Ilist_iter& operator=(const Ilist_iter& it){ if(this!=&it)curr=it. curr; return *this; } Ilist_iter& operator++(); bool operator==(const Ilist_iter& it)const{return curr==it. curr; } bool operator!=(const Ilist_iter& it)const{return curr!=it. curr; } int& operator*()const{return ((Int_link*)curr)->data; } void operator*(int d){ ((Int_link*)curr)->data=d; } Int_link* current()const{return (Int_link*)curr; } }; };
Методи Int_list: : iterator& Int_list: : iterator: : operator++(){ if(curr->next)curr=curr->next; else ++curr; return *this; } const Int_list: : iterator Int_list: : end()const{ iterator it(*this); if(empty()) return it; Link* temp=head; while ( temp ){ if (!temp->next)it. past_element(); else ++it; temp=temp->next; } return it; }
Int_list: : find () Int_link* Int_list: : find(int d)const{ if(!head){ return 0; } iterator it=begin(); iterator itn=it; ++itn; while(itn!=end() && (*it!=d)){ it=itn; ++itn; } if(*it==d) return it. current(); return 0; } Int_link* Int_list: : find(int d)const{ if(!head){ return 0; } Int_link* tmp=(Int_link* )head; Int_link* tmpn=(Int_link* )tmp->next; while(tmpn->next && (tmpn->data!=d)){ tmp=tmpn; tmpn=(Int_link*)tmpn->next; } if(tmpn->data==d) {return tmpn; } return 0; }
Позиціювання вузлів ітераторами Int_list a; next data next 0 data head cu rr it 1 cu rr it 2 4 it e 3 Int_list: : iterator it(a); Int_list: : iterator it 1( it ); const Int_list: : iterator ite=a. end(); while(!(it==ite)){ cout<<*it<<endl; ++it; }
Використання ітераторів // у методах списку void Int_list: : print()const{ iterator it(*this); const iterator ite=end(); while(!(it==ite)){ cout<<*it<<endl; ++it; } } // у зовнішньому коді Int_list: : iterator it(a); const Int_list: : iterator ite=a. end(); while(!(it==ite)){ cout<<*it<<endl; ++it; } it=a. begin(); ++it; *it=100; cout <<*it;