Стандартты контейнерлі кластар

 

Дәріс мақсаты: контейнер түсінігімен танысу және контейнерлік кластарды қолдануға үйрену.

Кілттік сөздер: контейнер; контейнерлік класс; тізім; стек; кезек; дек.

Жоспар:

  1. Контейнерлік кластар

 

  1. Контейнерлік кластар.

Көптеген есептердің шешімі әр түрлі формадағы объектілердің жиынтығынан және өңдеулерінен тұрады.

Басқа типті объектілерді сақтауға және олармен жұмыс жасайтын объектті контейнер деп атайды. Контейнердің классикалық мысалдарына тізім, вектор, ассоциативті массивтер жатады. Кей кезде контейнер мазмұнын тізбектелген деп атайды.

С++ тілінде контейнерлерді контейнерлік және параметрлік кластарды қолдану арқылы жүзеге асырады.

Контейнерлік класс – кейбір объектілерді басқарушы объектіге,яғни контейнерге қосу үшін композиция немесе толтыру механизімін қолданатын өңдеуді қабылдау класы. Контейнерлік кластар бірнеше объектілік өрістерден немесе объектіге көрсететін өрістерден тұрады. Егер контейнерлік класс композиция механизімін қолданса, онда басқарушы объектілердің типі мен саны объектілік өрістердің типі және санымен анықталған. Егер толтыру механизімін қолданса, контейнер кейбір базалардың объектілерін және осы кластағы барлық объектілерін басқара алады.

 Кез келген контейнерлік кластың негізгі мақсаты объектілерді тізбектеп өңдеу. Бұл өңдеу екі әдіспен жүзеге асырылады:

  1. Контейнердің барлық элементтерін қарау үшін құрылған арнайы процедураға негізделеді. Бұл процедураға параметр ретінде контейнер элементтерін өңдеу алгоритмін жүзеге асыратын функция немесе процедура аты беріледі.
  2. Берілген контейнердің түріне сәйкес келетін анықталған итератор немесе класс итераторы арқылы жүзеге асырылады. Итераторлардың көмегімен программист контейнерлермен жұмыс жасай алады. Бірнеше кілттік компонеттік функциялар программистке тізбектелген элементтердің соңын табуға мүмкіндік береді.

         Әдетте контейнерлік кластар вектор(vector), тізім(enumeration), динамикалық вектор(dynamic vector), стек(stack), очередь(queue), дек(deq), жиын(set), бір және бірнеше байланыс тізімдер(lists) типтік структураларды жүзеге асырады.

         Осы келтірілген тізімнен вектор мен тізім динамикалық емес структурулар.

         Стек – элементтерді қосуға және алуға болатын бір жақ шеті дәнекерленген труба ретінде елестетуге болатын контейнер. Стек LIFO қызметін жүзеге асырады (Last in – first out, соңғы келген – бірінші кетеді.)

 

 

Сурет 1: Стек

 

Мысал:

interface Stack {boolean empty();                            //Стек бос па?void    clear();                                 // Стекті босату.void    push(int val);                      // Стекке сан қосу (басына).int     pop() throws Exception;    // Стектің басындағы санды өшіру.int     top() throws Exception;     // Стектің басын алу (өшірмей).}Бос стектен элемент алуға болмайды.     

Кезек – соңынан басына қарай өтетін тек бір бағытта бағытталған екі шеті бар труба ретінде қарастыруға болады. Кезек FIFO қызметін жүзеге асырады (First in – first out, бірінші келген – бірінші кетеді.)

 

 

 

Сурет 2: Кезек

 

 

Мысал:

interface Queue {boolean empty();             // Кезек бос па?void    clear();                            // Кезекті босату.void    push(int val);      // Кезекке сан қосу (соңына).int     pop() throws Exception;    // Кезектің басынан санды өшіруint     front() throws Exception; // Кезектің басын алу(өшірмей).}

Бос кезектен стектен сияқты элемент алуға болмайды.

 

Дек – (double ended queue, екі жақты кезек) –стек пен кезектің симбиозы. Бір бірінен тәуелсіз жұмыс жасауға болатын екі шеті ашық труба ретінде елестетуге болады.

 

 

Сурет 3: Дек

              

Мысал:

interface Deq {boolean empty();           // Дек бос па?void    clear();               // Декті босату.void    pushFront(int val);    // Дектің басына сан қосу.void    pushBack(int val);    // Дектің соңына сан қосу.int     popFront() throws Exception;    // Дектің бірінші элементін өшіру.int     popBack() throws Exception;    // Дектің соңғы элементін өшіру.int     front() throws Exception;   // Дектің бірінші элементін алу (өшірмей).int     back() throws Exception;  // Дектің соңғы элементін алу (өшірмей).}             L2-тізім сызықты екі байланысты тізім – жіпке өткізілген моншақ ретінде елестетуге болады. Тізім үшін оның басы және соңы, сондай-ақ көрсеткіш анықталған. Көрсеткіш әр уақытта тізім элементтерінің арасында болады. Төмендегі мысалды көрсетілгендей тізімге элементті қосу немесе жою тек көрсеткіштің қасында ғана орындалады. 

 

Сурет 4: L2-список

 Мысал:interface L2List {boolean empty();      // Тізім бос па?void    clear();                                        // Тізімді босату.void    toFront();                                  // Көрсеткішті тізімнің басына жылжыту.void    toBack();                                           // Көрсеткішті тізімнің соңына жылжыту.boolean begin();                            // Көрсеткіш тізімнің басында ма?boolean end();                             // Көрсеткіш тізімнің соңында ма?void    forward() throws Exception;       // Көрсеткішті алдыға жылжыту.void    backward() throws Exception;    // Көрсеткішті артқа жылжыту.int     after() throws Exception;            // Көрсеткіштен кейін сан алу;int     before() throws Exception;       // Көрсеткіштің алдында сан алу;void    insertBack(int val);               // Көрсеткіштен кейін сан қосу;void    insertFront(int val);            // Көрсеткіштің алдында сан қосу;int     eraseBack() throws Exception;    // Көрсеткіштен кейінгі санды өшіру .int     eraseFront() throws Exception; // Көрсеткіштің алдындағі санды өшіру.}

 

         Мысал: Элемент бойынша өңдеу процедурасымен контейнерлік класс.

Сан – Жол – Таблица иерархия кластарына жататын сұрыпталған элементтер тізімі базасында контейнер жасау керек болсын. Кластар структурасын кезең бойынша құрамыз. Иерархия кластарының негізіне Тізім – Элемент кластарын саламыз.

Бұл екі класс басқарылатын объектілері Элемент класынан алынған контейнерлік класттарды құрады. Тізім класы Элемент класының элемент-объектілер көрсеткіші: бірінші элементке көрсеткіш, соңғы элементке көрсеткіш және ағымдағы элементке көрсететін үш өрістерден тұрады. Элемент класы келесі және алдыңғы тізім элементтерінің адресін сақтайтын, сол кластағы элемент көрсеткіштерінен тұратын екі өрістен тұрады.

Содан соң осы класттардың базасында Сұрыпталған тізім абстрактілі контейнерлік класын құрамыз. Онда элементтерді салыстыратын ішкі шақырылатын әдіс Compare-мен Sort сұрыптау әдісі қарастырылған. Бұл ішкі салыстыру әдісі осы кластың базасында әр түрлі сұрыптауларды қолдануға болатын басқа класттарды құруға мүмкіндік береді.

 

Бақылау сұрақтары:

  1. Контейнер дегеніміз не?
  2. Контейнерлік класс ұғымын қалай түсінесіз?
  3. Контейнерлік класс түрлері қандай?

 

Әдебиеттер:

  1. Павловская Т.А. С и С++. Программирование на языке высокого уровня.
  2. Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004
  3. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учебное пособие. – М.: Финансы и статистика, 2004
  4. Гради Буч. Объектно — ориентированный анализ и проектирование с примерами приложений на С++. — М.: Изд. Бином, Невский Диалект, 1998.
  5. А.В. Замулин. Курс лекций: ООП (С++, Ява, C#)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *