8. olio-ohjelmoinnin peruskäsitteitäjjauhiai/opetus/olio/oo2.pdf · operator= string assignment...

22
T740103 Olio-ohjelmointi Olio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat, Standard Template Library (STL) ja algoritmit © Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011 8. Olio-ohjelmoinnin peruskäsitteitä Olio-ohjelmoinnin peruskäsite on luokka (class). Luokka sisältää sekä tiedot (attribuutit) että tietoja käsittelevät aliohjelmat (palvelut, services) yhdessä kokonaisuudessa. Attribuutteja ja palveluita kutsutaan luokan jäseniksi (members). Attribuutit ovat luokan tietojäseniä (data members) ja aliohjelmat jäsenfunktioita (member functions). Luokan jäsenet voivat olla joka yksityisiä (private), suojattuja (protected) tai julkisia (public). Tavallisesti tietojäsenet ovat yksityisiä, eli niitä voidaan käsitellä ainoastaan luokan sisällä. Vastaavasti aliohjelmajäsenet ovat julkisia, jolloin luokan tarjoamia palveluita voidaan kutsua luokan ulkopuolelta. Luokan sisäinen rakenne ja toteutus on piilotettu käyttäjältä. Suojattuja jäseniä tarvitaan periytymisessä, johon palataan myöhemmin. Jäsenfunktion toteutusta sanotaan metodiksi, joka vastaa aliohjelman toteutusta (runko-osaa). Kun olio haluaa käyttää luokkansa palveluita, se lähettää luokalle viestin (message). string s=”Aku Ankka”; cout << “Merkkijonon pituus on “ << s.length(); Esimerkissä luodaan merkkijono-olio s. Olio lähettää viestin string-luokan metodille length(), joka palauttaa merkkijonon pituuden. 9. Muistinvarausluokat C++:ssa on kolme muistinvarausluokkaa * : Automaattinen Dynaaminen Staattinen Tähän asti käsitellyt muuttujat ovat olleet automaattisia, eli ne syntyvät automaattisesti, kun ohjelma tulee siihen ohjelmalohkoon, jossa ne on määritelty, ja tuhoutuvat kun ohjelmalohkosta poistutaan. * Tässä merkityksessä luokalla tarkoitetaan eri asiaa kuin olio-ohjelmointikäsitteen luokkaa. Muistinvarausluokka tarkoittaa, että meillä on kolme erilaista tapaa varata muistia. 1

Upload: dinhthuan

Post on 24-Mar-2018

223 views

Category:

Documents


7 download

TRANSCRIPT

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

8. Olio-ohjelmoinnin peruskäsitteitä

Olio-ohjelmoinnin peruskäsite on luokka (class). Luokka sisältää sekä tiedot (attribuutit) että tietoja

käsittelevät aliohjelmat (palvelut, services) yhdessä kokonaisuudessa. Attribuutteja ja palveluita

kutsutaan luokan jäseniksi (members). Attribuutit ovat luokan tietojäseniä (data members) ja

aliohjelmat jäsenfunktioita (member functions). Luokan jäsenet voivat olla joka yksityisiä (private),

suojattuja (protected) tai julkisia (public). Tavallisesti tietojäsenet ovat yksityisiä, eli niitä voidaan

käsitellä ainoastaan luokan sisällä. Vastaavasti aliohjelmajäsenet ovat julkisia, jolloin luokan tarjoamia

palveluita voidaan kutsua luokan ulkopuolelta. Luokan sisäinen rakenne ja toteutus on piilotettu

käyttäjältä. Suojattuja jäseniä tarvitaan periytymisessä, johon palataan myöhemmin.

Jäsenfunktion toteutusta sanotaan metodiksi, joka vastaa aliohjelman toteutusta (runko-osaa). Kun olio

haluaa käyttää luokkansa palveluita, se lähettää luokalle viestin (message).

string s=”Aku Ankka”;

cout << “Merkkijonon pituus on “ << s.length();

Esimerkissä luodaan merkkijono-olio s. Olio lähettää viestin string-luokan metodille length(), joka

palauttaa merkkijonon pituuden.

9. MuistinvarausluokatC++:ssa on kolme muistinvarausluokkaa*:

• Automaattinen

• Dynaaminen

• Staattinen

Tähän asti käsitellyt muuttujat ovat olleet automaattisia, eli ne syntyvät automaattisesti, kun ohjelma

tulee siihen ohjelmalohkoon, jossa ne on määritelty, ja tuhoutuvat kun ohjelmalohkosta poistutaan.

* Tässä merkityksessä luokalla tarkoitetaan eri asiaa kuin olio-ohjelmointikäsitteen luokkaa. Muistinvarausluokka tarkoittaa, että meillä on kolme erilaista tapaa varata muistia.

1

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Tällaisten muuttujien tarvitsema muistitila voidaan määrittää jo käännösaikana. Ohjelmoijan ei

erikseen tarvitse välittää niiden luomisesta ja tuhoamisesta.

Entäs jos tarvitaan vaihtuva määrä muistia, jonka pitää pystyä muuttumaan ohjelman suorituksen

aikana ? On mahdollista myös luoda muuttujia tarpeen mukaan dynaamisesti. Tällaiset muuttujat eivät

tuhoudu kun ohjelmalohkosta poistutaan, vaan ne on erikseen tuhottava “käsin”. Tämä mahdollistaa

tehokkaamman muistin käytön. Ei tarvitse varata tarpeettomasta muistia esimerkiksi kiinteäkokoisten

taulukoiden avulla.

On myös mahdollista luoda ajonaikaisia staattisia muuttujia. Ne ovat olemassa koko ohjelman

suorituksen ajan ja säilyttävät arvonsa, vaikka poistutaankin siitä ohjelmalohkosta, jossa ne oli luotu.

Staattinen muuttuja alustuu automaattisesti nollaksi.

int *Dynamic;

{

static int Static; // allocated only once - at runtime -

int Auto; // allocated each time the current { } block is executed

Dynamic = new int; // allocated when you want - each call of new -

} // Auto is destructed when out of scope

delete Dynamic; // Dynamic deleted whenever you want

// Static is destructed when the program ends

9.1 Dynaaminen muistinvaraus

Muuttuja varataan dynaamisesti operaattorilla new. Taulukko varataan antamalla alkioiden lukumäärä

hakasuluissa, aivan kuten tavallinen taulukkokin:

pointer = new typepointer = new type [number_of_elements]

New palauttaa osoittimen varattuun muistipaikkaan tai taulukon tapauksessa osoittimen taulukon

ensimmäiseen alkioon.

2

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Yksi muuttuja:

int *bill = new int;

Taulukko:

int * bobby;

bobby = new int [5];

tai

int *bobby = new int [5];

Varattu muisti on vapautettava delete -operaattorilla, kun sitä ei enää tarvita.

delete bill;

delete [] bobby;

Dynaamisesti määritelty muuttujaa käytetään kuten osoitinta. Tärkein sovellus on taulukon varaaminen

ohjelman suorituksen aikana.

3

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

#include <iostream>

using namespace std;

int main()

{

int n;

cout << "Montako lukua haluat syöttää ?" << endl;

cin >> n;

int *luvut = new int[n];

for (int i=0;i<n;i++)

{

cout <<"Luku ?" << endl;

cin >> luvut[i];

}

cout << "Luvut olivat:"<< endl;

for (int i=0;i<n;i++)

{

cout << luvut[i] << endl;

}

delete [] luvut;

return 0;

}

On syytä muistaa, että tietokoneen muisti (varsinkin sulautetuissa järjestelmissä) on rajallinen. Siten

voi tulla vastaan tilanne, että vapaata muistia ei ole tarpeeksi halutun kokoisen taulukon varaamiseksi.

Tähän tilanteeseen on syytä varautua siten, että ohjelman suoritus lopetetaan siististi virheilmoitukseen.

C++ tarjoaa tähän ns. poikkeukset (exception). Jos esimerkiksi edellisen ohjelman lause

int *luvut = new int[n];

4

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

epäonnistuu yrityksessään varata muistia, new palauttaa ns. bad_alloc-poikkeuksen. Jos tätä

poikkeusta ei käsitellä erillisen poikkeuskäsittelijän (exception handler) avulla ja ohjelman suoritus

loppuu. Jos halutaan, että ohjelman suoritus kaikesta huolimatta jatkuu, voidaan lauseeseen lisätä

nothrow-optio, joka estää poikkeuksen syntymisen:

int *luvut = new (nothrow) int[n];

Jos tilanvaraus epäonnistui, osoitin osoittaa nollaosoittimeen (NULL pointer). Tämä on tarkistettava,

ennen kuin ohjelman suoritusta voidaan jatkaa:

int *luvut = new (nothrow) int[n];

if (luvut == NULL)

return 1;

Eli jos luvut osoittaa nollaosoittimeen, lopetetaan ohjelman suoritus. Muuten jatketaan eteenpäin.

Tässä vielä esimerkki siitä, miten varsinainen poikkeusten käsittely tapahtuu käyttäen C++:n try-catch-

rakennetta:// bad_alloc standard exception

#include <iostream>

#include <exception>

using namespace std;

int main () {

try

{

int* myarray= new int[1000];

}

catch (exception& e)

{

cout << "Standard exception: " << e.what() << endl;

}

return 0;

}

5

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Eli yritetään (try) varata 1000 alkion kokoinen kokonaislukutaulukko muistista. Jos onnistuu niin

mennään eteenpäin. Jos ei onnistu, mennään catch-haaraan, jossa käsitellään virhetilanne ja ohjelman

suoritus loppuu. Tässä esimerkissä catch-haarassa ainoastaan tulostetaan tieto siitä, mikä poikkeus on

tapahtunut e.what()-metodilla. Alkuun on lisätty exception-kirjasto, joka sisältää poikkeusolioiden

tarvitsemat palvelut.

10. Standard Template Library (STL)

C-kielen ongelma on, että taulukkojen koot on tiedettävä etukäteen. Lisäksi C ei tarjoa mitään keinoa

automaattiseen indeksin tarkistukseen. Toisin sanoen on täysin ohjelmoijan vastuulla, ettei taulukoa

indeksoida sen koon yli.

Sovelluksissa on usein tarpeen kasvattaa tai supistaa taulukon kokoa ”lennossa”. Tämä on toki

mahdollista ohjelmoida itsekin new ja delete-operaattoreilla. Ei kuitenkaan välttämättä kannata

keksiä pyörää uudelleen, koska C++:n Standardimallikirjasto (Standard Template Library) eli STL

sisältää suuren joukon valmiita tietorakenteita olioiden dynaamiseen käsittelyyn.

Aikaisemmin tällä kurssilla on käytetty jo string-luokkaa, joka kuuluu STL-kirjastoon.

Tässä yhteydessä tarkastellaan kahta muuta yksinkertaista STL:n avulla toteutettavaa tietorakennetta

list ja vector. Täydellinen kuvaus STL:n luokista löytyy esimerkiksi Silicon Graphicsin

kotisivuilta osoitteessa

http://www.sgi.com/tech/stl/table_of_contents.html

10.1 Käsitteitä

Malli eli template on määrittely, jota käyttämällä voidaan luoda samankaltaisten olioiden perheitä.

Malli on ohje kääntäjälle luoda geneerisestä tyyppiriippumattomasta ohjelmakoodista tyyppiin sidottua

ohjelmakoodia. Malleja käytetään, kun samanlainen logiikka toistuu eri tietotyyppejä käytettäessä.

6

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Tarkemmin Malleista kerrotaan Markun materiaalissa luvussa 25.

Esimerkkejä: Luodaan vektori luvut, joka sisältää kokonaislukuja:

vector <int> luvut;

Luodaan lista nimet, joka sisältää merkkijonoja:

list <string> nimet;

Kaikille vektori- ja listaoliolle on esimerkiksi olemassa metodi, joka lisää tai poistaa niihin uuden

alkion riippumatta siitä, mikä alkion tyyppi on.

Säiliö eli container on olio, joka sisältää toisia olioita. Säiliöllä on metodeja, joiden avulla se pystyy

käsittelemään sisältämiään olioita. Jokaiselle säiliötyypille on määritelty iteraattori-tyyppi, jonka avulla

säiliön alkiot käydään läpi. Säiliö ”omistaa” sisältämänsä oliot ja olioiden elinaika ei voi olla pidempi

kuin itse säiliön.

STL:n kaikki säiliöluokat:

• Yksinkertaiset säiliöluokat (Simple Container Classes)o vectoro listo stacko queueo deque

• Assosiatiiviset säiliöluokat(Associative Container Classes)o mapo seto multimapo multiset

7

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Lähes kaikki säiliöluokat sisältävät seuraavat metodit:• push_front Lisätään alkio säiliön alkuun (ei määritelty vektorille)• pop_front Poistetaan ensimmäinen alkio (ei määritelty vektorille)• push_back Lisätään alkio säiliön loppuun• pop_back Poistetaan viimeinen alkio• empty Totuusarvo joka ilmaisee onko säiliö tyhjä• size Säiliön koko• insert Lisätään uusi alkio • erase Poistetaan alkio• clear Poistetaan kaikki alkiot• resize Muutetaan säiliön kokoa• front Osoitin ensimmäiseen alkioon• back Osoitin viimeiseen alkioon

Iteraattori on yleistetty osoitin. Se osoittaa säiliön yksittäiseen elementtiin. Sen käsittely ohjelmassa

on hyvin samankaltainen kuin osoittimen:

Esimerkki:vector <int>::iterator it;

…it++; //siirretään iteraattori seuraavaan säiliön alkiooncout << *it; //tulostetaan it:n osoittaman alkion sisältö

10.2 String

Kuten aikaisemmin on tullut ilmi, string on merkkijonojen käsittelyyn tarkoitettu luokka. Oheiseen

taulukkoon on koottu luokan metodit.

(constructor) Construct string object (constructor member)

operator= String assignment (public member function)

Iterators:

begin Return iterator to beginning (public member function)

end Return iterator to end (public member function)

rbegin Return reverse iterator to reverse beginning (public member function)

rend Return reverse iterator to reverse end (public member function)

8

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Capacity:

size Return length of string (public member function)

length Return length of string (public member function)

max_size Return maximum size of string (public member function)

resize Resize string (public member function)

capacity Return size of allocated storage (public member function)

reserve Request a change in capacity (public member function)

clear Clear string (public member function)

empty Test if string is empty (public member function)

Element access:

operator[] Get character in string (public member function)

at Get character in string (public member function)

Modifiers:

operator+= Append to string (public member function)

append Append to string (public member function)

push_back Append character to string (public member function)

assign Assign content to string (public member function)

insert Insert into string (public member function)

erase Erase characters from string (public member function)

replace Replace part of string (public member function)

swap Swap contents with another string (public member function)

String operations:

c_str Get C string equivalent (public member function)

data Get string data (public member function)

get_allocator Get allocator (public member function)

copy Copy sequence of characters from string (public member function)

find Find content in string (public member function)

rfind Find last occurrence of content in string (public member function)

find_first_of Find character in string (public member function)

find_last_of Find character in string from the end (public member function)

find_first_not_of Find absence of character in string

find_last_not_of Find absence of character in string from the end (public member function)

substr Generate substring (public member function)

compare Compare strings (public member function)

9

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

10.3 Vektori

Vektori muistuttaa tavallista C-taulukkoa siinä, että se sisältää nolla tai useampia samantyyppistä ja –

kokoista alkiota, jotka sijaitsevat keskusmuistissa peräkkäisissä muistipaikoissa. Uusia alkioita

voidaan lisätä ja poistaa vektorin lopusta. Alkioihin voidaan viitata satunnaisessa järjestyksessä []-

indeksoinnilla (kuten C:n taulukkoon). Periaatteessa on mahdollista lisätä alkioita myös vektorin

alkuun tai keskelle, mutta linkitetty lista on niihin tapauksiin parempi ratkaisu.

Vektori on STL:n säiliöluokista yksinkertaisin ja samalla yleensä kaikkein tehokkain.

Tässä ohjelmassa luetaan lukuja vektoriin luvut niin kauan kunnes syötetään ei-positiivinen

kokonaisluku. Huomaa, että missään vaiheessa ohjelmoijan ei välttämättä tarvitse tietää vektorin kokoa

eikä huolehtia siitä, onko tilaa riittävästi.

Metodit begin() ja end()palauttavat osoittimen vektorin alkuun ja loppuun (viimeisen alkion

jälkeen).

10

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

#include <iostream>

#include <vector>

using namespace std;

int main()

{

vector <int> luvut;

vector <int>::iterator it; //iteraattori

int x;

do

{

cout << "Luku ? " << endl;

cin >> x;

luvut.push_back(x); //Lisää alkio vektorin loppuun

} while (x>0);

cout << "Vektorissa on " << luvut.size() << " alkiota." <<endl;

for (it=luvut.begin();it!=luvut.end();it++)

{

cout << *it << endl;

}

return 0;

}

Oheisessa kuvassa on havainnollistettu

push_back()-metodin toimintaa: Vektoriin

lisätään 5. alkio, jonka arvo on 10. Osoitin

vektorin loppuun luvut.end() siirtyy

automaattisesti. Säiliö voi olla muukin kuin

valmiiksi määritelty tietotyyppi.

11

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Seuraavassa on määritelty tietue rekisteri, joka sisältää opiskelijan etunimen, sukunimen ja

arvosanan. Rekisteri-tyyppinen muuttuja nimi sisältää yhden opiskelijan tiedot. Vektori nimet

sisältää listan kaikista opiskelijoista.

#include <iostream>

#include <vector>

#include <string>

using namespace std;

struct rekisteri

{

string en;

string sn;

int as;

};

int main()

{

rekisteri nimi;

vector <rekisteri> nimet;

vector <rekisteri>::iterator it; //iteraattori

char x;

do

{

cout << "Etunimi ? " << endl;

cin >> nimi.en;

cout << "Sukunimi ? " << endl;

cin >> nimi.sn;

12

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

cout << "Arvosana ? " << endl;

cin >> nimi.as;

nimet.push_back(nimi);

fflush(stdin);

cout << "Jatketaanko (k/e) ?" << endl;

cin.get(x);

} while (x!='e');

cout << "Vektorissa on " << nimet.size() << " alkiota." <<endl;

for (it=nimet.begin();it!=nimet.end();it++)

{

cout << it -> en << " " << it ->sn << " " << it -> as << endl;

}

return 0;

}

13

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Edelliseen vielä sellainen huomautus, että iteraattori on aina osoitin. Tässsä iteraattori it on osoitin

tietueeseen. Tietueosoittimen yksittäiseen kenttään viitataan nuolioperaattorilla ->.

Tässä luettelo vector-luokan metodeista:

assign Erases a vector and copies the specified elements to the empty vector.

at Returns a reference to the element at a specified location in the vector.back Returns a reference to the last element of the vector.

begin Returns a random-access iterator to the first element in the container.capacity Returns the number of elements that the vector could contain without allocating more storage.

clear Erases the elements of the vector.empty Tests if the vector container is empty.

end Returns a random-access iterator that points just beyond the end of the vector.erase Removes an element or a range of elements in a vector from specified positions.

front Returns a reference to the first element in a vector.get_allocator Returns an object to the allocator class used by a vector.

insert Inserts an element or a number of elements into the vector at a specified position.

14

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

max_size Returns the maximum length of the vector.pop_bak Deletes the element at the end of the vector.

push_back Add an element to the end of the vector.rbegin Returns an iterator to the first element in a reversed vector.

rend Returns an iterator to the end of a reversed vector.resize Specifies a new size for a vector.

reserve Reserves a minimum length of storage for a vector object.size Returns the number of elements in the vector.

swap Exchanges the elements of two vectors.

10.4 Lista

STL:n lista on ns. kaksoislinkitetty lista (double linked list). . Lista koostuu peräkkäisestä solmuista.

Solmu sisältää datan sekä joko yksi tai kaksi linkkiä listan edelliseen ja / tai seuraavaan alkioon.

Yksinkertainen linkitetty lista sisältää datan ja osoittimen seuraavaan listan alkioon:

Kaksisuuntainen linkitetty lista sisältää osoittimen sekä edelliseen että seuraavaan alkioon:

Kaksoislinkitetty lista tarvitsee enemmän tilaa keskusmuistista kuin yksinkertainen. Se tarjoaa

kuitenkin vastaavasti monipuolisemman tavan käydä listaa läpi molempiin suuntiin.Ohessa graafisesti

esitettynä listan alkion lisääminen ja poisto.

15

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

STL:n listaan voi lisätä alkioita joko alkuun (push_front), loppuun (push_back) tai välille (insert).

#include <iostream>

#include <list>

using namespace std;

int main()

{

list <int> luvut1,luvut2;

list <int>::iterator it;

int luku;

do

{

16

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

cout << "Luku ?" << endl;

cin >> luku;

//Pano edestä:

luvut1.push_front(luku);

//Pano takaa:

luvut2.push_back(luku);

} while (luku>0);

cout << "luvut1:" << endl;

for (it=luvut1.begin();it!=luvut1.end();it++)

{

cout << *it << endl;

}

cout << "luvut12:" << endl;

for (it=luvut2.begin();it!=luvut2.end();it++)

{

cout << *it << endl;

}

return 0;

}

Ohessa on esitetty luettelo list-luokan metodeista:

assign Erases elements from a list and copies a new set of elements to the target list.

back Returns a reference to the last element of a list.begin Returns an iterator addressing the first element in a list.

clear Erases all the elements of a list.empty Tests if a list is empty.

end Returns an iterator that addresses the location succeeding the last element in a list.erase Removes an element or a range of elements in a list from specified positions.

17

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

front Returns a reference to the first element in a list.get_allocator Returns a copy of the allocator object used to construct a list.

insert Inserts an element or a number of elements or a range of elements into a list at a specified position.max_size Returns the maximum length of a list.

merge Removes the elements from the argument list, inserts them into the target list, and orders the new, combined set of elements in ascending order or in some other specified order.

pop_back Deletes the element at the end of a list.pop_front Deletes the element at the beginning of a list.

push_back Adds an element to the end of a list.push_front Adds an element to the beginning of a list.

rbegin Returns an iterator addressing the first element in a reversed list.remove Erases elements in a list that match a specified value.

remove_if Erases elements from the list for which a specified predicate is satisfied.rend Returns an iterator that addresses the location succeeding the last element in a reversed list.

resize Specifies a new size for a list.reverse Reverses the order in which the elements occur in a list.

size Returns the number of elements in a list.sort Arranges the elements of a list in ascending order or with respect to some other order relation.

splice Removes elements from the argument list and inserts them into the target list.swap Exchanges the elements of two lists.

unique Removes adjacent duplicate elements or adjacent elements that satisfy some other binary predicate from the list.

18

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

10.5 Map

Map on säiliöluokka, jossa tieto esitetään avain-arvo-pareina. Avain ja arvo säilytetään oliossa, jonka tyyppi on pair. Luokalla pair on kaksi jäsentä:

o first on avain o second on itse arvo

Esimerkki:

map<int, string *> PhoneBook;

Muistissa oheinen map-määrittely näyttää seuraavalta:

Esimerkkiohjelma tulostaa teletappien nimet ja värit. Nimi on avain ja väri on data

#include <iostream>#include <map>#include <string>using namespace std;

int main() { map<string, string> teletapit;

19

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

teletapit["Tiivitaavi"]="violetti"; teletapit["Hipsu"]="vihreä"; teletapit["Laalaa"]="keltainen"; teletapit["Pai"]="punainen"; map<string, string>::const_iterator iter; for (iter=teletapit.begin();\

iter != teletapit.end(); ++iter) { cout << iter->first << " on väriltään " \

<< iter->second << endl; } return 0;}

10.6 Algoritmit

STL-kirjastossa on joukko valmiita algoritmeja, joiden avulla monet tyypilliset ohjelmointitehtävät on mahdollista tehdä ilman, että niitä tarvitsee kirjoittaa itse alusta. Tällaisia toimintoja on esimerkiksi lajittelu (sort) ja haku (find). Olemme aikaisemmin tutustuneet mm. swap- ja reverse-algoritmeihin. Tässä on esitetty täydellinen lista STL:n algoritmeista. Läheskään kaikkia ei tällä kurssilla tarvita, mutta lienee hyvä tietää, mitä kaikkea löytyy valmiina, jos jotain näistä joskus oikeasti tarvitsee.

This section provides a list of all the standard STL algorithms listed by category, together with an encoded description of their input parameters and a brief synopsis. The following table shows the meanings of letters used to decode input parameters shown in the algorithm list.

Key

Meaning Key Meaning

b Bi-directional iterator p Predicate

f Forward iterator r Random access iterator

g Function object v Value

i Input iterator & Reference to a value

o Output iterator

For example, the input parameters for the for_each() algorithm are iig . Using the above table, you can determine that for_each() takes two input iterators and a function object as arguments.

20

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

Applying for_each iig Apply a function to every item in a range.

Bounding equal_range ffv Return the lower and upper bounds within a range.

lower_bound ffv Return the lower bound within a range. upper_bound ffv Return the upper bound within a range.

Comparing equal iii Check that two sequences match.

lexicographical_compare iii Lexicographically compare two sequences.

mismatch iii Search two sequences for a mismatched item.

Copying copy iio Copy a range of items to another area.

copy_backward bbb Copy a range of items backwards to another area.

Counting count iiv Count items in a range matching a value.

count_if iip Count items in a range satisfying a predicate.

Filling fill ff Set every item in a range to a particular value. fill_n o Set n items to a particular value. Filtering unique ff Collapse all consecutive values in a sequence.

unique_copy iio Copy a sequence, collapsing consecutive values.

Generating generate ffg Fill a sequence using a generator function.

generate_n og Generate a specified number of items.

Heap make_heap rr Make a sequence into a heap.

pop_heap rr Pop the top value from a heap.

push_heap rr Place the last element into a heap.

sort_heap rr Sort a heap.

Math Operations accumulate iiv Sum the values in a range.

adjacent_difference iio Calculate the difference between adjacent pairs of values.

inner_product iiiv Calculate the inner product of two sequences.

partial_sum iio Fill a range with a running total.

median vvv Calculate the median of three values.

Merging inplace_merge bbb Merge two sorted lists in place into a single sorted list.

merge iiiio Merge two sorted lists into a single sorted list.

Min/Max min && Return the minimum of two items.

max && Return the maximum of two items.

min_element ii Return the minimum item within a range.

max_element ii Return the maximum item within a range.

Partitioning nth_element rrr Partition a range by its nth element.

partition bbp Partition a range using a predicate.

21

T740103 Olio-ohjelmointiOlio-ohjelmoinnin peruskäsitteitä, Muistinvarausluokat,

Standard Template Library (STL) ja algoritmit© Jukka Jauhiainen OAMK Tekniikan yksikkö 2010,2011

stable_partition bbp Partition a range using a predicate.

Permuting next_permutation bb Change sequence to next lexicographic permutation.

prev_permutation bb Change sequence to last lexicographic permutation.

Removing remove ffv Remove all matching items from a sequence.

remove_copy iiov Copy sequence, removing all matching items.

remove_copy_if iiop Copy sequence, removing all that satisfy predicate.

remove_if ffp Remove items satisfying predicate from a sequence.

Replacing replace ffvv Replace specified value in a sequence with another.

replace_copy iiovv Copy sequence replacing values satisfying predicate.

replace_if ffpv Replace specified values satisfying a predicate.

Reversing reverse bb Reverse the items in a sequence.

reverse_copy bbo Create a reversed copy of a sequence.

Rotating

rotate fff Rotate a sequence by n positions.

rotate_copy fffo Copy a sequence, rotating it by n positions

Searching adjacent_find ii Locate consecutive sequence in a range.

binary_search ffv Locate an item in a sorted sequence.

find iiv Locate an item in a sequence.

find_if iip Locate an item satisfying a predicate in a range.

search ffff Locate one sequence within another.

Set Operations includes iiii Search for one sequence in another sequence.

set_difference iiiio Create set of elements in first sequence that are not in second.

set_intersection iiiio Create set of elements that are in both sequences.

set_symmetric_difference iiiio Create set of elements that are not in both sequences.

set_union iiiio Create set of elements that are in either sequence.

Shuffling random_shuffle rr Randomize sequence using random shuffles.

Sorting partial_sort rrr Sort the smallest n elements of a sequence.

partial_sort_copy iirr Sort the smallest n elements of a sequence.

sort rr Sort a sequence.

stable_sort rr Sort a sequence.

Swapping iter_swap ff Swap the values indicated by two iterators.

swap && Swap two values.

swap_ranges fff Swap two ranges of items.

Transforming transform iiog Transform one sequence into another.

22