Rozdzial 11. Klasy kontener - PowerPoint PPT Presentation

1 / 36
About This Presentation
Title:

Rozdzial 11. Klasy kontener

Description:

Rozdzia 11. Klasy kontener w 1) Kontenery sekwencyjne 2) Kontenery asocjacyjne 3) Algorytmy 4) Strings, Byte Arrays i Variants Poj cie kontenera Kontener lub ... – PowerPoint PPT presentation

Number of Views:158
Avg rating:3.0/5.0
Slides: 37
Provided by: KKK65
Category:

less

Transcript and Presenter's Notes

Title: Rozdzial 11. Klasy kontener


1
Rozdzial 11.Klasy kontenerów
  • 1) Kontenery sekwencyjne
  • 2) Kontenery asocjacyjne
  • 3) Algorytmy
  • 4) Strings, Byte Arrays i Variants

2
Pojecie kontenera
  • Kontener lub inaczej pojemnik to taka struktura
    danych, której glównym zadaniem jest
    przechowywanie w zorganizowany sposób zbioru
    danych (obiektów). Kontener zapewnia narzedzia
    dostepu takie jak dodawanie, usuwanie czy
    wyszukiwanie obiektów w kontenerze. Kontenery
    róznia sie wydajnoscia poszczególnych operacji.
  • Na podstawie Wikipedii

3
Zalety kontenerów QT
  • 1) Dzialaja tak samo na wszystkich platformach
  • 2) Zawieraja latwy w uzyciu iterator
    zainspirowany jezykiem Java
  • 3) Na niektórych platformach sprzetowych
    wspieranych przez Qtopia Core, kontenery Qt sa
    jedynymi kontenerami jakich mozna uzywac
  • 4) Implicit sharing (copy on write)?

4
Kontenery sekwencyjne
  • 1) QVectorltTgt - tablica, która przechowuje
    kolejne pozycje w sasiadujacych ze soba komórkach
    pamieci
  • QVectorltdoublegt vect(2)?
  • vect0 1.0
  • vect1 0.5678
  • QVectorltdoublegt vect
  • vect.append(1.0)
  • vect.append(0.5678)
  • Mozna uzyc operatora ltlt zamiast append()
  • vect ltlt 1.0 ltlt 0.5678

5
Przegladanie wektora
  • double sum 0.0
  • for(int i 0 i lt vect.count() i)
  • sum vecti

6
  • 2) QLinkedListltTgt - przechowuje kolejne dane w
    nie sasiadujacych ze soba komórkach pamieci.
    QLinkedListltTgt jest bardziej wydajny niz
    QVectorltTgt w przypadku dodawania lub usuwania
    skladników z poczatku lub srodka struktury.
  • QLinkedListltQStringgt list
  • list.append(aaa)
  • list.append(ccc)
  • QLinkedListltQStringgtiterator i
    list.find(ccc)
  • list.insert(i,bbb)
  • Zamiast operatora musimy w przypadku
    QLinkedList uzywac iteratorów.

7
  • 3) QListltTgt - stanowi kombinacje najwiekszych
    zalet QVectorltTgt i QLinkedListltTgt. Ma interfejs
    oparty na indeksach.
  • 4)QStringListltTgt - jest podklasa klasy
    QListltQStringgt. Wprowadza kilka dodatkowych
    funkcji, dzieki czemu staje sie wygodniejsza przy
    obsludze napisów.
  • 5) QStackltTgt - push(), pop(), top()?
  • 6) QQueueltTgt - enqueue(), dequeue(), head()?

8
Czym moze byc ltTgt
  • 1) Typem prostym int, double
  • 2) Wskaznikiem
  • 3) Klasa która ma domyslny konstruktor,
    konstruktor kopiujacy, operator przypisania
  • 4) Kontenerem
  • (QlistltQVectorltdoublegt gtlist)?

9
Kategorie iteratorów
  • Qt wprowadza dwie kategorie iteratorów sluzacych
    do przegladania danych znajdujacych sie w
    kontenerze
  • 1) iteratory w stylu jezyka Java
  • 2) iteratory w stylu Standard Template Library
    (STL)?

10
Iteratory w stylu jezyka Java
  • 1) Read-only iterator QVectorIteratorltTgt,
    QLinkedListIteratorltTgt and QListIteratorltTgt
  • 2) Read-write iterator QMuatbleVectorIteratorltTgt,
    QMutableLinkedListIteratorltTgt,
    QMutableListIteratorltTgt

11
QListIteratorltTgt
  • Typowa petla
  • QListltdoublegt list
  • ... QListIteratorltdoublegt i(list)
  • while (i.hasNext())
  • do_something(i.next())

12
  • Usuwanie wszystkich liczb ujemnych z kontenera
  • QMutableListIteratorltdoublegt i(list)
  • while(i.hasNext())
  • if (i.next() lt 0.0)
  • i.remove()
  • Zastepowanie liczb ujemnych ich wartoscia
    bezwzgledna
  • QMutableListIteratorltdoublegt i(list)
  • while (i.hasNext())
  • int val i.next()
  • if (val lt 0.0)
  • i.setValue(-val)

13
Iteratory w stylu STL
  • W Qt wystepuja dwa rodzaje iteratorów w stylu
    STL
  • 1) CltTgtiterator
  • 2) CltTgtconst_iterator
  • Iterator CltTgtconst_iterator nie pozwala nam na
    modyfikowanie danych.

14
  • W przypadku iteratorów w stylu STL mozemy
    poslugiwac sie operatorami lub -- w celu
    przemieszczania sie po kolejnych elementach
    struktury. Operator pozwala nam dostac sie do
    wartosci, na która wskazuje iterator.

15
  • Przyklad zastepowania wartosci ich wartosciami
    bezwzglednymi
  • QListltdoublegtiterator i list.begin()
  • while(i!list.end())?
  • i qAbs(i)
  • i

16
  • Przegladanie kontenerów zwracanych przez funkcje
  • Poprawny sposób
  • QListltintgt list splitter-gtsizes()
  • QListltintgtconst_iterator i list.begin()
  • while(i!list.end())?
  • do_something(i) i
  • Niepoprawny sposób
  • QListltintgtconst_iterator i splitter-gtsizes().b
    egin()
  • while(i!splitter-gtsizes().end())?
  • do_something(i) i
  • Uzywajac iteratorów w stylu STL nalezy zawsze
    przegladac kopie kontenera zwróconego przez
    wartosc

17
  • Uzywajac iteratorów w stylu jezyka Java nie
    musimy tworzyc zadnych kopii. Wszystko odbywa sie
    bez naszego udzialu
  • QListIteratorltintgt i(splitter-gtsizes())
  • while(i.hasNext())?
  • do_something(i.next())

18
  • QVectorltdoublegt sineTable()
  • QVectorltdoublegt vect(360)
  • for (int i0 ilt360 i)
  • vecti sin(i/2M_PI))
  • return vect
  • QVectorltdoublegt table sineTable()
  • void sineTable(vectorltdoublegt vect)
  • vect.resize(360)
  • for (int i0 ilt360 i)
  • vecti sin(i/(2M_PI))
  • Vectorltdoublegt table
  • sineTable(table)

19
Implicit sharing (copy on write)?
  • Zalety
  • 1) Kopiowanie jest tak szybkie jak w przypadku
    kopiowania pojedynczego wskaznika
  • 2) Nie wymaga zadnego dodatkowego dzialania ze
    strony programisty (nie musi sie niczym
    przejmowac)?
  • 3) Zacheca do stosowania przejrzystego stylu
    programowania, gdzie obiekty sa zwracane przez
    wartosc

20
Jak dziala Implicit Sharing?
  • Qstring str1 AAA
  • Qstring str2 str1
  • Licznik referencji 2 dla pierwszej struktury.
  • str20 'D'
  • Licznik referencji dla obu struktur danych wynosi
    1.
  • str1 str2
  • Licznik referencji dla pierwszej struktury danych
    wynosi 0 i ta struktura danych jest usuwana z
    pamieci. Dla drugiej struktury licznik referencji
    wynosi teraz 2.
  • Implicit Sharing gwarantuje, ze dane nie beda
    kopiowane, jezeli nie zostana zmodyfikowane.

21
  • Jeszcze jedna metoda przegladania elementów w
    kontenerze sekwencyjnym (petla foreach)
  • QLinkedListltMoviegt list
  • ...
  • foreach(Movie movie,list)?
  • if(movie.title()Citizen Kane)?
  • cout ltlt Found Citizen Kane ltlt endl
  • break

22
Kontenery Asocjacyjne
  • Kontenery asocjacyjne przechowuja dowolna liczbe
    elementów tego samego typu, indeksowanych po
    kluczu. Qt wprowadza dwie glówne klasy kontenerów
    asocjacyjnych QMapltK,Tgt i QHashltK,Tgt

23
QMapltK,Tgt
  • QMapltK,Tgt - struktura danych, która przechowuje
    pary klucz-wartosc w porzadku rosnacym kluczy.
  • Dodawanie elementów
  • QMapltQString,intgt map
  • map.insert(seven,7)
  • // lub alternatywnie mapseven 7
  • Wydobywanie danych
  • int val map.value(seven)
  • //lub alternatywnie mozemy posluzyc sie
    operatorem ,
  • QMultiMapltint,QStringgt multiMap
  • multiMap.insert(1,one) multiMap.insert(1,jeden
    )
  • QListltQStringgtvals multiMap.values(1)

24
  • Instrukcja
  • int seconds map.value(delay,30)
  • Jest równowazna instrukcjom
  • Int seconds 30
  • If(map.contains(delay))
  • seconds map.value(delay)

25
QHashltK,Tgt
  • QHashltK,Tgt - struktura danych, która przechowuje
    pary klucz-wartosc w tablicy haszowej. Umozliwia
    szybszy przeglad danych niz QMapltK,Tgt. QHashltK,Tgt
    jest nieuporzadkowany.
  • reserve() okreslamy jak wiele elementów bedzie
    przechowywanych w strukturze.
  • squeeze() - zmniejszamy rozmiar struktury.

26
Klucz i wartosc sa dostepne poprzez funkcje key()
i value()?
  • QMapltQString,intgtmap
  • ...
  • int sum 0
  • QMapIteratorltQString,intgti (map)
  • while(i.hasNext())?
  • sumi.next().value()
  • QMapIteratorltQString,intgti map()
  • while(i.hasNext())?
  • i.next()
  • if(i.value()gtlargestValue)?
  • largestKeyi.key()
  • largestValue i.value()

27
Algorytmy
  • ltQtAlgorithmsgt - naglówek ten deklaruje zbiór
    globalnych szablonów funkcji, które implementuja
    podstawowe algorytmy na kontenerach.
  • ltalgorithmgt - naglówek ten wprowadza bardziej
    kompletny zbiór algorytmów. Te algorytmy moga byc
    uzywane zarówno na kontenerach Qt jak i
    kontenerach STL.

28
Przyklady zastosowan algorytmów
  • qFind() - wyszukuje podana przez nas wartosc w
    kontenerze
  • QStringList l
  • l ltlt Emma ltlt Karl ltlt James
  • QStringListiterator i qFind(l.begin(),l.end(),
    Karl)
  • qBinaryFind algorytm ten zaklada, ze dane w
    strukturze sa posortowane i dzieki czemu moze
    zastosowac szybkie wyszukiwanie binarne
  • qFill() - wypelnia kontener okreslonymi
    wartosciami
  • QLinkedListltintgt list(10)
  • qFill(list.begin(),list.end(),1009)

29
Przyklady zastosowan algorytmów c.d.
  • qCopy() - kopiuje wartosci z jednego kontenera do
    drugiego. Moze byc równiez uzywany do kopiowania
    wartosci w tym samym kontenerze.
  • QVectorltintgt vect(list.count())
  • qCopy(list.begin(),list.end(),vect.begin())
  • qSort() - sortuje elementy kontenerze.
  • qSort(list.begin(),list.end())
  • qSort(list.begin(),list.end(),qGreaterltintgt())
  • qStableSort() - podobny do qSort(), ale dodatkowo
    gwarantuje, ze elementy które mialy taka sama
    wartosc przed sortowaniem beda mialy taka sama
    kolejnosc po sortowaniu.

30
Przyklady zastosowan algorytmów c.d.
  • qDeleteAll() - wywoluje delete na kazdym
    wskazniku przechowywanym w kontenerze.
  • qDeleteAll(list)
  • list.clear()
  • qSwap() - wymienia wartosci pomiedzy dwoma
    zmiennymi.
  • int x1 line.x1()
  • int x2 line.x2()
  • if(x1gtx2)?
  • qSwap(x1,x2)

31
Strings, Byte Arrays and Variants
  • QString struktura danych przypominajaca wektor
    i sluzaca do przechowywania obiektów typu QChar.
  • 1) length(), append(), sprintf(), arg(),
    number(), setNum(), toInt(), toLong(),
    toDouble(), mid(), left(), right(), indexOf(),
    startsWith(), endsWith(), toUpper(), toLower(),
    replace(), remove(), insert(), trimmed(),
    simplified(), split(), join(), isEmpty(),
    toAscii(), fromAscii(), toLatin(), fromLatin()
  • 2) operatory ,

32
  • QString str User
  • str userName\n
  • QString str User
  • str.append(userName)
  • str.sprintf(s.1f,perfect competition,100.0)
  • str QStringnumber(59.6)
  • str.setNum(59.6)
  • Bool ok Double d str.toDouble(ok)
  • QString str Ala ma kota
  • qDebug() ltlt str.mid(3,4)
  • qDebug() ltlt str.left(8) ltlt ltlt str.right(9)

33
  • If ((url.startsWith(http)
    url.endsWith(.png))?
  • if(fileName.toLower() readme.txt)?
  • QString str a cloudy day
  • str.replace(2,6,sunny)
  • str.remove(2,6)
  • str.insert(2,sunny)
  • str.replace(,amp)
  • QString str BOB \t THE \nDOG \n
  • qDebug() ltlt str.trimmed()
  • qDebug() ltlt str.simplified()
  • QString str polluter pays principle
  • QStringList words str.split( )

34
QByteArray
  • QByteArray
  • 1) left(), right(), mid(), toLower(), toUpper(),
    Trimmed(), aimplified()?
  • 2) Do przechowywania surowych danych binarnych
  • 3) Brak wsparcia dla Unicodu.

35
QVariant
  • QVariant
  • 1) Sluzy do przechowywania danych róznych typów w
    jednej zmiennej
  • 2) Mozemy organizowac dane w sposób jaki tylko
    chcemy
  • QMapltQString, Qvariantgt pearMap
  • pearMapStandard 1.95
  • pearMapOrgranic 2.25
  • QMapltQString,QVariantgt fruitMap
  • fruitMapOrange 2.10
  • fruitMapPineapple 3.85
  • fruitMaPear pearMap

36
  • KONIEC
  • Rozdzial opracowany na podstawie ksiazki pod
    tytulem C GUI Programming with Qt
  • Krzysztof Srodon
Write a Comment
User Comments (0)
About PowerShow.com