List_Iterators.ppt
- Количество слайдов: 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труктура ітератора Aggregate Create. Iterator() Client Iterator First() Next() Current. Item() Concrete. Aggregate Create. Iterator() Concrete. Iterator
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; curr ite it 2 curr it 1 curr Int_list: : iterator it(a); Int_list: : iterator it 1(it); 2 const Int_list: : iterator ite=a. end(); 3 while(!(it==ite)){ cout<<*it<
Використання ітераторів // у методах списку void Int_list: : print()const{ iterator it(*this); const iterator ite=end(); while(!(it==ite)){ cout<<*it<