8. olio-ohjelmoinnin peruskäsitteitäjjauhiai/opetus/olio/oo2.pdf · operator= string assignment...
Post on 24-Mar-2018
225 Views
Preview:
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
top related