Programovanie 3.

Transkript

Programovanie 3.
Programovanie 3.
2012 – 2013
11. Prednáška
STL – II.
Ing. František Gyárfáš, PhD.
Katedra aplikovanej informatiky
[email protected]
http://www.ii.fmph.uniba.sk/~gyarfas/
Ako programovať reálny svet?
Ako to dátovo reprezentovať?
class PESNICKA {
string nazov;
string textPlusAkordy;
};
Výhody:
Jednoduchá a jasná reprezentácia.
Nevýhody:
Nutnosť analyzovať pri každom čítaní.
Predspracovanie:
Oddelenie akordov od textu
Vložíme do textu oddeľovače:
$-akord, #-fraza
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Ukladanie po riadkoch
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
class PESNICKA {
string nazov;
string riadky[100];
};
Zlepšenie:
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Ideálne pre načítavanie. (getline)
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Problémy:
Nebezpečná manipulácia s polom.
Náhrada poľa – čím?
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
class PESNICKA {
string nazov;
vector<string> riadky;
};
Zlepšenie:
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Nehrozí pretečenie.
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Problémy:
Nutnosť analyzovať pri každom čítaní.
Ukladanie po frázach
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
class PESNICKA {
string nazov;
vector<string> frazy;
};
Zlepšenie:
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Zjednodušené čítanie.
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Problémy:
Nutnosť oddeľovať akordy od textu pri čítaní.
Oddelenie akordov od textu
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
class PESNICKA {
string nazov;
vector<string> akordy;
vector<string> texty;
};
Zlepšenie:
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Oddelenie akordov od textu sa vykoná iba raz.
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Problémy:
Ak verš nemá akord, mám problém.
Spojenie akordov s textami
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
class FRAZA {
string text;
string akord;
};
class PESNICKA {
string nazov;
vector<FRAZA> frazy;
};
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Zlepšenie:
Akordy s textami sú bezpečne spárované.
Problémy:
Chýba informácia o riadkoch.
Verše a frázy
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
class FRAZA {
string text;
string akord;
Ami$Penízky ukryl jsem do hlíny pod dubem,#
};
až příště přiletí, my už tu nebudem,#
class VERS {
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
vector<FRAZA> frazy;
};
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
class PESNICKA {
Ami$o lásce, o zradě, #Dmi$o světe#
string nazov;
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
vector<VERS> verse;
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
};
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Zlepšenie:
Dátová štruktúra odráža štruktúru textu.
Problémy:
Neviem, aký zoznam akordov pieseň obsahuje.
Pridanie zoznamu akordov
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Zlepšenie:
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
Samostatný zoznam akordov.
class FRAZA {
string text;
string akord;
};
class VERS {
vector<FRAZA> frazy;
};
class PESNICKA {
string nazov;
vector<VERS> verse;
vector<string> akordy;
};
Problémy:
Zoznam akordov môže obsahuje duplikáty.
Zoznam akordov nie je utriedený.
Potrebujem:
Zoznam, ktorý nepovoľuje duplikáty.
Zoznam, ktorý sa automaticky usporiadava.
Sekvenčné kontajnery a adaptéry
Zoznam, ktorý nepovoľuje duplikáty.
Zoznam, ktorý sa automaticky usporiadava.
vector – je lineárna sekvencia objektov.
deque – je to fronta s dvoma koncami.
list – je to obojstranný zreťazený zoznam.
Adaptér stack sa správa ako zásobník LIFO (last in, first out).
Adaptér queue sa správa ako fronta FIFO (first in, first out).
Adaptér priority_queue sa správa ako usporiadaný zásobník.
Môžem použiť priority_queue?
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
class FRAZA {
string text;
string akord;
Ami$Penízky ukryl jsem do hlíny pod dubem,#
};
až příště přiletí, my už tu nebudem,#
class VERS {
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
vector<FRAZA> frazy;
};
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
class PESNICKA {
Ami$o lásce, o zradě, #Dmi$o světe#
string nazov;
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
vector<VERS> verse;
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
priority_queue<string> akordy;
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
};
C$tajemství, která teď #E7$neseme na bedrech.#
Zlepšenie:
Usporiadaný zoznam akordov.
Problémy:
Dostanem sa iba k vrchnému akordu.
Asociatívne kontajnery
Asociatívne kontajnery – používajú kľúče a umožňujú ich prostredníctvom
rýchly prístup k jednotlivým položkám.
•
set – kľúč je samotná hodnota. Obsahuje max. 1 prvok tej istej hodnoty.
•
multiset – kľúč je samotná hodnota. Môže obsahovať viacero
prvkov tej istej hodnoty.
•
map – obsahuje dvojice hodnôt: unikátny kľúč a hodnota. Obsahuje
max. 1 prvok s tým istým kľúčom .
•
multimap – obsahuje dvojice hodnôt. Umožňuje viac hodnôt s tým
istým kľúčom.
Položky v asociatívnych kontajneroch sú usporiadané, preto je vždy
definovaný spôsob usporiadania, ktorý si vyžaduje porovnávaciu funkciu
(predikát).
Zoznam akordov ako množina
Ami$Spatřil jsem kometu, oblohou letěla,#
chtěl jsem ji zaspívat, ona mi zmizela#
Dmi$zmizela jako laň #G7$u lesa v remízku#
C$v očích mi zbylo jen #E7$pár žlutých penízkú.#
Ami$Penízky ukryl jsem do hlíny pod dubem,#
až příště přiletí, my už tu nebudem,#
Dmi$my už tu nebudem, #G7$ach, pýcho marnivá#
spatřil jsem kometu, chtěl jsem jí zaspívat.#
Ami$O vodě, o trávě, #Dmi$o lese,#
G7$o smrti, se kterou smířit #C$nejde se,#
Ami$o lásce, o zradě, #Dmi$o světe#
E$a o všech lidech, co kdy #E7$žili na téhle#Ami$planetě.#
Ami$Na hvězdném nádraží cinkají vagóny,#
pan Kepler rozepsal nebeské zákony#
Dmi$hledal, až nalezl #G7$v hvězdářských triedrech#
C$tajemství, která teď #E7$neseme na bedrech.#
class FRAZA {
string text;
string akord;
};
class VERS {
vector<FRAZA> frazy;
};
class PESNICKA {
string nazov;
vector<VERS> verse;
set<string> akordy;
};
Zlepšenie:
Množina set akordov nepovoľuje duplikáty.
Množina set sa automaticky usporiadava.
Problémy:
???
Ako vytvoriť spevník ?
Spevník by mal obsahovať zoznam pesničiek a množinu akordov, ktoré je potrebné
ovládať na zahranie všetkých pesničiek v spevníku.
class SPEVNIK {
vector<PESNICKA> zoznam;
set<string> akordy;
};
Problémy:
Náročné vyhľadávanie pesničiek.
Chýba ochrana pred duplikátmi pesničiek.
Čo si vybrať pre pesničky?
class SPEVNIK {
vector<PESNICKA> zoznam;
set<string> akordy;
};
set – kľúč je samotná hodnota. Obsahuje max. 1 prvok tej istej hodnoty.
multiset – kľúč je samotná hodnota. Môže obsahovať viacero prvkov tej
istej hodnoty.
map – obsahuje dvojice hodnôt: unikátny kľúč a hodnota. Obsahuje max. 1
prvok s tým istým kľúčom .
multimap – obsahuje dvojice hodnôt. Umožňuje viac hodnôt s tým istým
kľúčom.
Mapa pesničiek
class SPEVNIK {
map<string, PESNICKA> spevnik;
set<string> akordy;
};
Problémy:
Nie je možné mať dve rôzne piesne s rovnakým názvom.
class SPEVNIK {
multimap<string, PESNICKA> spevnik;
set<string> akordy;
};
Asociatívne kontajnery
Asociatívne kontajnery – používajú kľúče a umožňujú ich prostredníctvom
rýchly prístup k jednotlivým položkám.
Položky v asociatívnych kontajneroch sú usporiadané, preto je vždy
definovaný spôsob usporiadania, ktorý si vyžaduje porovnávaciu funkciu
(predikát).
Asociatívny kontajner set
Syntax:
template <class Kluc, class Predikat>
kľúč
class set ;
Samotná trieda
usporiadanie
Preddefinovaný predikát:
template <class Key, class Compare = less<Key> >
class set;
Konštruktory kontajnera set
set<type, predicate> name;
Vytvorí prázdnu množinu set.
set<type, predicate>
name(sourceSet);
Vytvorí kópiu množiny sourceSet.
set<type, predicate>
name(prvy,
posl);
Skopíruje elementy zdrojovej množiny od
iterátora prvy po iterátor posl.
Vkladanie položiek do množiny
Metóda insert vkladá novú hodnotu do množiny na miesto určené predikátom.
intSet.insert(10);
V prípade existencie položky s danou hodnotou insert novú položku ignoruje.
intSet.insert(10);
intSet.insert(10);
Návratová hodnota insert
Metóda insert vracia dvojicu pair< set<int>::iterator, bool >.
Druhá položka (second) vracia true, ak bol vložený nový prvok a false, ak už sa
daný prvok v množine nachádza.
Prvá položka (first) je iterátor na nový prvok, príp. iterátor na už existujúci
prvok s danou hodnotou.
#include <iostream>
#include <set>
using namespace std;
int main () {
set<int> myset;
set<int>::iterator it;
pair< set<int>::iterator, bool > ret;
ret = myset.insert(10);
string vlozenie = (ret.second == true) ? "Prve = " : "Druhe = ";
cout << vlozenie << *ret.first << endl;
ret = myset.insert(10);
it = ret.first;
vlozenie = (ret.second == true) ? "Prve = " : "Druhe = ";
cout << vlozenie << *it << endl;
}
Predikát
template<class T> class mensi{
public:
bool operator()(T x, T y) {
return x < y;
}
};
int main(){
set<int, mensi<int> > intSet;
intSet.insert(10);
intSet.insert(15);
intSet.insert(0);
intSet.insert(30);
intSet.insert(10);
intSet.insert(60);
set<int, mensi<int> >::iterator it;
template<class T> class vacsi{
public:
bool operator()(T x, T y) {
return x > y;
}
};
int main(){
set<int, vacsi<int> > intSet;
intSet.insert(10);
intSet.insert(15);
intSet.insert(0);
intSet.insert(30);
intSet.insert(10);
intSet.insert(60);
set<int, vacsi<int> >::iterator it;
for (it = intSet.begin()
; it!=intSet.end(); it++){
cout << *it << " ";
}
for (it = intSet.begin()
; it!=intSet.end(); it++){
cout << *it << " ";
}
}
}
Hádanka: aký predikát pre LIFO
template<class T> class LIFO{
public:
bool operator()(T x, T y) {
return ???????????;
}
};
int main(){
set<int, LIFO<int> > intSet;
intSet.insert(10);
intSet.insert(15);
intSet.insert(0);
intSet.insert(30);
intSet.insert(10);
intSet.insert(60);
set<int, LIFO<int> >::iterator it;
for (it = intSet.begin()
; it!=intSet.end(); it++){
cout << *it << " ";
}
}
Kontajner multiset
multiset –množina, ktorá môže obsahovať viac elementov s tou
istou hodnotou.
#include <iostream>
#include <set>
using namespace std;
int main(){
multiset<char> multiSet;
multiSet.insert('A');
multiSet.insert('g');
multiSet.insert('0');
multiSet.insert('%');
multiSet.insert('w');
multiSet.insert('W');
multiSet.insert('A');
multiSet.insert('0');
multiset<char>::iterator iter;
cout << "Mnozina multiset: " << endl;
for (iter = multiSet.begin(); iter!=multiSet.end(); iter++){
cout << *iter << " ";
}
}
Mapy ako asociatívne polia
Normálne polia spájajú dve veličiny: index a objekt hodnoty.
Mapy sú asociatívne polia. Tiež spájajú dve veličiny: objekt kľúča a objekt
hodnoty. Mapy sú vždy usporiadané podľa predikátu usporiadania.
template <class Key, class Val, class Predikat = less<Key>
class
mapa;
kľúč
hodnota
usporiadanie
samotná trieda
Konštruktory kontajnera map
map<Kluc, Hod, predikat> name;
Prázdny kontajner map.
map<Kluc, Hod, predikat> name(source);
Kópia kontajnera source.
map<Kluc, Hod, predikat> name(prvy, posl);
Skopíruje elementy
zdrojového kontajnera od
iterátora prvy po iterátor
posl.
Iterátory do kontajnera map obsahujú dvojicu hodnôt (kľúč a hodnota) :
map<Kluc, Hod>::iterator iter;
Kluc k = (*iter).first;
Hod
h = iter->second;
//
iter->first
// (*iter).second
Vkladanie do mapy s insert
Do mapy vkladáme nový objekt pomocou metódy insert.
charMap.insert(pair<int, char>(6,'V'));
Metóda insert má jeden vstupný parameter:
pair<kluc,hodnota>()
alebo
map<kluc,hodnota>::value_type()
Návratová hodnota insert
Metóda insert vracia objekt, obsahujúci dvojicu hodnôt: iterátor
ukazujúci na vloženú položku a informáciu, či bol objekt vložený.
pair< map<kluc,hodnota>::iterator, bool >
pair<map<int,char>::iterator, bool> ret;
ret = charMap.insert(pair<int, char>(6,'V'));
ret = charMap.insert(map<int, char>::value_type(6,'V'));
Ak mapa už obsahuje položku s daným kľúčom, insert novú hodnotu
nevloží, vráti iterátor na už existujúci prvok s daným kľúčom a false.
map - operator[]
Asociatívny kontajner map má definovaný operator[].
Parameter tohto operátora je kľúč.
mnozina[3]
Ak element s daným kľúčom sa v kontajneri už nachádza, operátor vracia
referenciu na tento element.
Ak hodnota s daným kľúčom už existuje, táto hodnota sa prepíše.
mnozina[3] = 'A';
Ak hodnota s daným kľúčom ešte neexistuje, do kontajnera sa vloží nový
element s danými hodnotami.
mnozina[3] = 'B';
Kontajner multimap
multimap – je mapa, ktorá môže obsahovať viac elementov s rovnakým kľúčom.
#include <iostream>
#include <map>
using namespace std;
const int MAX = 6;
int main() {
multimap<int, char> charMap;
charMap.insert(multimap<int, char>::value_type(1,'A'));
charMap.insert(multimap<int, char>::value_type(2,'X'));
charMap.insert(multimap<int, char>::value_type(1,'Y'));
charMap.insert(multimap<int, char>::value_type(22,'X'));
charMap.insert(multimap<int, char>::value_type(2,'B'));
charMap.insert(multimap<int, char>::value_type(4,'B'));
multimap<int, char>::iterator iter;
for (unsigned int i = 0; i < MAX; i++){
iter = charMap.find(i);
if (iter == charMap.end()){
cout << "Polozka " << i << " nie je." << endl;
}
else{
while(iter->first == i) {
cout << "Polozka s klucom " << i << "-" << iter->second << endl;
iter++;
}
}
}
}
Algoritmy pre kontajnery
U algoritmov hovoríme transformuj namiesto vykonaj pre všetky prvky
v definovanom rozsahu.
Algoritmy zvyšujú objektovosť programovania.
Algoritmy zvyčajne očakávajú iterátory ukazujúce na prvý a posledný
prvok spracovávaného úseku kontajnera.
Šanca, že algoritmus je naprogramovaný správne a neobsahuje chyby, je
podstatne vyššia, ako u priameho použitia cyklov for, while a pod.
Pravidlo rozumného sebapodceňovania
Bezpečné programovanie
Uprednostňujte
volanie algoritmov
je krásny pred
sen. písaním vlastných cyklov.
Generické algoritmy
Nemodifikujúce algoritmy
Meniace algoritmy
Odstraňujúce algoritmy
Usporadúvajúce algoritmy
Numerické algoritmy
Všetky algoritmy sa nachádzajú v namespace std a ich hlavičky sa
nachádzajú v:
#include <algorithm>
Nemodifikujúce algoritmy
#include <algorithm>
int count(first, last, val);
int count_if(first, last, pred);
Spočíta výskyt vyhovujúcich elementov
od iterátora first po last podľa
hodnoty alebo predikátu.
Ďalšie algoritmy vracajú iterátor prvého nájdeného elementu podľa zvoleného
kritéria:
iter = find_if(first,last,pred);
Vráti iterátor na prvý element s hodnotou
val alebo podľa predikátu pred medzi
iterátormi first a last.
iter = min(first, last);
iter = max(first, last);
Vráti iterátor na najmenší (min) alebo
najväčší (max) element.
iter = find(first, last, val);
Vykoná funkciu pre každý element:
for_each(first, last, func);
Zbehne funkciu func nad všetkými
elementami medzi iterátormi first a
last. Nemení hodnoty kontajnera.
Meniace algoritmy
fill(first, last, val);
Vloží hodnotou val od first po
last.
fill_n(first, n, val);
Vloží hodnotou val do n prvkov
počínajúc first.
generate(first, last, gen);
Vloží hodnotou od first po last
generovanú funkciou gen.
generate_n(first, n, gen);
Vloží hodnotou do n prvkov počínajúc
first generovanú funkciou gen.
copy(first, last, target);
Skopíruje hodnoty od iterátora first po
last do novej pozície od iterátora
target. Iterátor target môže byť v
tom istom kontajneri, alebo aj v inom.
Meniace algoritmy II.
replace(first,last,val1,val2);
Nahradí hodnotu val1 s val2
reverse(first, second);
Vymení hodnoty
random_shuffle(first, second);
Náhodne prehádže hodnoty
Odstraňujúce algoritmy
remove(first, last, val);
Odstráni elementy s hodnotou val, ale
nezmenší kontajner.
remove_if(first, last, pred);
Odstráni elementy vyhovujúce predikátu
pred, ale nezmenší kontajner.
remove_copy(first, last,
target, val);
Skopíruje obsah s odstránením kópií
elementu s val, ale nezmenší kontajner.
remove_copy_if(first, last,
target, pred);
Odstráni kópie elementu vyhovujúce
predikátu pred, ale nezmenší kontajner.
Všetky algoritmy remove_X vracajú iterátor na nový posledný prvok.
new_last= remove(first,last,val);
new_last je iterátor ukazujúci za nový
posledný prvok
Úplné odstránenie položiek
Je možné privolať metódu kontajnerov erase, ktorá úplne odstráni prvky
odstránené algoritmom remove a zmení veľkosť kontajnera.
vector<int>::iterator last_iter;
last_iter = remove(vect.begin(), vect.end(), 10);
vect.erase(last_iter, vect.end());
vect.erase(remove(vect.begin(), vect.end(), 10), vect.end());
Usporadúvajúce algoritmy
sort(first, last);
Usporiada podľa hodnôt.
sort(first,last,greater<int>())
Usporiada s explicitným predikátom.
nth_element(first, n_ty, last);
Všetky pred n_ty sú menšie ako n_ty a
ostatné väčšie alebo rovne.
partial_sort(first, n_ty,last);
Usporiada toľko elementov, koľko sa ich
zmestí po n_ty element.
merge(first1, last1, first2,
last2, result);
Spojí dva usporiadané kontajnery do
usporiadaného kontajneru result.
Väčšina usporadúvajúcich algoritmov má aj verziu s predikátom.
Numerické algoritmy
#include <numeric>
accumulate(first,last,result);
Pripočíta do hodnoty result hodnoty
prvkov od first po last.
accumulate(first,last,result,
f);
Pripočíta do hodnoty result hodnoty
funkcie f aplikovanej od first po last.
partial_sum(first,last,vystup);
Vkladá do kontajnera vystup postupné
sumy.
adjacent_difference(first,last,
vystup);
Vkladá do kontajnera vystup rozdiely
susedných hodnôt, pričom prvá hodnota sa
nemení.
Skúška
Podmienka pripustenia ku skúške:
•
Úspešné získanie min. 80 bodov z cvičení (do termínu skúšky). Po
vykonaní úspešnej skúšky už nie je dovolené odovzdávať cvičenia.
Úspešné spravenie skúšky:
•
Úspešné vyriešenie písomnej skúšky (min. 60 % úspešných testov)
•
Úspešné okamžité ústne obhájenie písomky
•
Odovzdanie a ohodnotenie semestrálneho projektu. Projekt je dovolené
odovzdať aj po úspešnej skúške (do 23.1.2010).
Hodnotenie na skúške
Skúška sa koná vo forme písomnej skúšky za počítačom. Obsahom skúšky je
vypracovanie riešenia zadanej úlohy. Forma zadania je podobná forme, akou
boli zadané všetky úlohy na cvičeniach. Rozdiel bude v tom, že súčasťou
zadanie nebude návod na riešenie úlohy.
Minimum na úspešné zvládnutie skúšky bude úspešné zvládnutie 60 %
všetkých testov z úlohy (tri skupiny testov). Pri dosiahnutí menej ako 60 %
úspešných testov je skúška neúspešná.
Termíny skúšok
Termíny skúšok budú počas skúšobného obdoba vždy v stredu popoludní od
13.00. Prihlasovanie sa na skúšku sa bude diať na stránke predmetu a počet
účastníkov skúšky bude cca. 25 študentov.
Má niekto záujem o vypísanie predtermínu na 19.12.2012 o 13.00?
Kontajner set - príklad
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> intSet;
intSet.insert(10);
intSet.insert(15);
intSet.insert(0);
intSet.insert(30);
intSet.insert(10);
intSet.insert(60);
set<int>::iterator iter;
cout << "Prvky mnoziny: " << endl;
for (iter=intSet.begin(); iter!=intSet.end(); iter++){
cout << *iter << endl;
}
getchar();
}
Usporiadanie podľa vloženia
#include <iostream>
#include <set>
using namespace std;
template<class T> class Porovnaj{
public:
bool operator()(T x, T y) {
return false;
}
};
int main(){
multiset<char, Porovnaj<char> > multiSet;
multiSet.insert('A');
multiSet.insert('g');
multiSet.insert('0');
multiSet.insert('&');
multiSet.insert('A');
multiSet.insert('W');
multiSet.insert('&');
multiSet.insert('0');
multiset<char, Porovnaj<char> >::iterator iter;
cout << "Prvky mnoziny multiset: " << endl;
for (iter = multiSet.begin(); iter!=multiSet.end(); iter++){
cout << *iter << endl;
}
getchar();
}
Príklad na insert
#include <iostream>
#include <map>
using namespace std;
void vypis(pair<map<char,int>::iterator,bool> ret){
if (ret.second) {
cout << "Vlozil hodnotu " << ret.first->second;
cout << " s klucom " << ret.first->first << endl;
}
else {
cout << "Hodnota " << ret.first->second;
cout << " sa uz nachadza s klucom " << ret.first->first << endl;
}
}
int main () {
map<char,int> mapa;
pair<map<char,int>::iterator,bool> ret;
ret = mapa.insert(pair<char, int>('a', 10) );
vypis(ret);
ret = mapa.insert(pair<char, int>('b', 20) );
vypis(ret);
ret = mapa.insert(pair<char, int>('b', 40) );
vypis(ret);
ret = mapa.insert(pair<char,int>('a', 30) );
vypis(ret);
getchar();
}
Pozor na operator[]
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> mapa;
mapa.insert(pair<int, string>(0, "prva"));
mapa.insert(pair<int, string>(2, "druha"));
mapa.insert(pair<int, string>(4, "tretia"));
cout << "Velkost mapy = " << mapa.size() << endl;
map<int, string>::iterator iter;
for (iter = mapa.begin(); iter != mapa.end(); iter++) {
cout << " [" << iter->first << "] = " << iter->second;
cout << endl;
}
cout << endl << "Velkost mapy = " << mapa.size() << endl;
unsigned int SIZE = mapa.size();
for (unsigned int i = 0; i < SIZE; i++){
cout << " [" << i << "] = " << mapa[i] << endl;
}
cout << endl << "Velkost mapy = " << mapa.size() << endl;
for (iter = mapa.begin(); iter != mapa.end(); iter++) {
cout << " [" << iter->first << "] = " << iter->second;
cout << endl;
}
getchar();
}
Príklad používania mapy
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> charMap;
charMap["prva"] = 1;
charMap["druha"] = 2;
charMap.insert(map<string, int>::value_type("prva", 11));
charMap["druha"] = 22;
charMap["druha"]++;
cout << "Obsah mapy: " << endl;
map<string, int>::iterator iter;
for (iter = charMap.begin(); iter != charMap.end(); iter++) {
cout << iter->first << " --> ";
cout << iter->second << endl;
}
getchar();
}
V akom pôjdu poradí?
Aké budú mať hodnoty?
Kontajner multimap
multimap – je mapa, ktorá môže obsahovať viac elementov s rovnakým kľúčom.
#include <iostream>
#include <map>
using namespace std;
const int MAX = 6;
int main() {
multimap<int, char> charMap;
charMap.insert(multimap<int, char>::value_type(1,'A'));
charMap.insert(multimap<int, char>::value_type(2,'X'));
charMap.insert(multimap<int, char>::value_type(1,'Y'));
charMap.insert(multimap<int, char>::value_type(22,'X'));
charMap.insert(multimap<int, char>::value_type(2,'B'));
charMap.insert(multimap<int, char>::value_type(4,'B'));
multimap<int, char>::iterator iter;
for (unsigned int i = 0; i < MAX; i++){
iter = charMap.find(i);
if (iter == charMap.end()){
cout << "Polozka " << i << " nie je." << endl;
}
else{
while(iter->first == i) {
cout << "Polozka s klucom " << i << "-" << iter->second << endl;
iter++;
}
}
}
getchar();
}
Príklad: count,find,for_each
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
template<class T> void vypis(T iter){
cout << iter << " ";
}
const int MAX = 5;
int main(){
multiset<int> kopa;
for(unsigned int i = 0; i < MAX; i++){
kopa.insert(i * 10);
kopa.insert(i * 20);
}
for_each(kopa.begin(), kopa.end(), vypis<int>);
cout << endl<< "Pocet = 0: " << count(kopa.begin(), kopa.end(), 0) << endl;
cout << "Pocet = 30: " << count(kopa.begin(), kopa.end(), 30) << endl;
cout << "Pocet < 30: "
<< count_if(kopa.begin(), kopa.end(), bind2nd(less<int>(),30)) << endl;
set<int>::iterator iter;
iter = find(kopa.begin(), kopa.end(), 30);
cout << "Dalsi element za 30:" << *(++iter) << endl;
iter = find_if(kopa.begin(), kopa.end(), bind2nd(greater<int>(),50));
cout << "Element > 50:" << *iter << endl;
cout << "Dalsi element za > 50:" << *(++iter) << endl;
getchar();
}
Príklad meniacich algoritmov
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
const int MAX = 5;
template<class T> void vypis(T iter){
cout << iter << " ";
}
int main(){
multiset<int> kopa;
for(unsigned int i = 0; i < MAX; i++){
kopa.insert(0);
}
multiset<int> kopa2(kopa);
fill(kopa.begin(), kopa.end(), 1);
for_each(kopa.begin(), kopa.end(), vypis<int>);
cout << endl;
fill_n(kopa.begin(), 3, 2);
for_each(kopa.begin(), kopa.end(), vypis<int>);
cout << endl;
generate(kopa.begin(), kopa.end(), std::rand);
for_each(kopa.begin(), kopa.end(), vypis<int>);
cout << endl;
copy(kopa.begin(), kopa.end(), kopa2.begin());
for_each(kopa2.begin(), kopa2.end(), vypis<int>);
getchar();
}
Príklad meniacich algoritmov
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 10;
template<class T> void vypis(T iter){
cout << iter << " ";
}
int nextI() {
static int element = -5;
return element++;
}
int main() {
vector<int> vect(MAX, 0);
generate(vect.begin(), vect.end(), nextI);
cout << "Zoznam: ";
for_each(vect.begin(), vect.end(), vypis<int>);
reverse(vect.begin(), vect.end());
cout << endl << "Opacne: ";
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << "Nahoda: ";
random_shuffle(vect.begin(), vect.end());
for_each(vect.begin(), vect.end(), vypis<int>);
getchar();
}
Príklad odstraňovania
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 8;
template<class T> void vypis(T iter){
cout << iter << " ";
}
int main () {
int myints[] = {10,20,30,30,20,10,40,20};
vector<int> vystup(MAX);
remove(myints, myints + MAX, 30);
vector<int>::iterator it;
remove_copy(myints, myints + MAX, vystup.begin(), 20);
cout << "Vystup obsahuje: " << endl;
for (it = vystup.begin(); it != vystup.end(); ++it) {
cout << *it << " ";
}
getchar();
}
Príklad úplného odstránenia
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 5;
template<class T> void vypis(T iter){
cout << iter << " ";
}
int main() {
vector<int> vect(MAX);
for(int i = 0; i < MAX; i++){
vect[i] = i;
}
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << endl;
vector<int>::iterator last_iter;
last_iter = remove(vect.begin(), vect.end(), 3);
for_each(vect.begin(), last_iter, vypis<int>);
cout << endl << endl;
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << endl;
vect.erase(last_iter, vect.end());
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << endl;
getchar();
}
Príklad pre usporiadania
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 10;
template<class T> void vypis(T iter){
cout << iter << " ";
}
int main() {
vector<int> vect(MAX);
for(int i = 0; i < MAX; i++){
vect[i] = i;
}
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << "Nahoda: ";
random_shuffle(vect.begin(), vect.end());
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << "Po 5 mensie: ";
nth_element(vect.begin(), vect.begin() + 5, vect.end());
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << "Cast usporiadana: ";
partial_sort(vect.begin(), vect.begin() + 5, vect.end());
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << "Cele usporiadane: ";
sort(vect.begin(), vect.end());
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << endl;
getchar();
}
Príklad pre spájanie
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 10;
template<class T> void vypis(T iter){
cout << iter << " ";
}
int main() {
vector<int> vect(MAX), vect2(MAX), vystup(MAX*2);
for(int i = 0; i < MAX; i++){
vect[i] = i * 2; vect2[i] = i * 2 + 1;
}
cout << "Prvy: ";
for_each(vect.begin(), vect.end(), vypis<int>);
cout << endl << "Druhy: ";
for_each(vect2.begin(), vect2.end(), vypis<int>);
merge(vect.begin(), vect.end(), vect2.begin(), vect2.end(),vystup.begin());
cout << endl << "Spolu: ";
for_each(vystup.begin(), vystup.end(), vypis<int>);
random_shuffle(vect.begin(), vect.end());
cout << endl << "Mix: ";
for_each(vect.begin(), vect.end(), vypis<int>);
merge(vect.begin(), vect.end(), vect2.begin(), vect2.end(),vystup.begin());
cout << endl << "Spolu: ";
for_each(vystup.begin(), vystup.end(), vypis<int>);
getchar();
}
Príklad pre numerické algoritmy
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
const int MAX = 10;
template<class T> void vypis(T iter){
cout << iter << " ";
}
int main() {
vector<int> vect(MAX), vystup(MAX);
for(int i = 0; i < MAX; i++){
vect[i] = i;
}
cout << "Zoznam: ";
for_each(vect.begin(), vect.end(), vypis<int>);
int suma = accumulate(vect.begin(), vect.end(), 0);
cout << endl << "Suma: " << suma;
partial_sum(vect.begin(), vect.end(), vystup.begin());
cout << endl << "Ciastocne sumy: ";
for_each(vystup.begin(), vystup.end(), vypis<int>);
adjacent_difference(vect.begin(), vect.end(), vystup.begin());
cout << endl << "Rozdiely: ";
for_each(vystup.begin(), vystup.end(), vypis<int>);
getchar();
}

Podobné dokumenty

INDUSTRIÁLNE KULTY

INDUSTRIÁLNE KULTY světle), Luise L. Hay (Miluj svoj život), tématiku alternatívnej medicíny Powel (Silvova metóda pro 90. léta), či dokonca zakladataľa kultu s hinduistickým pozadím Bhagwana Šrí Rajneesha napr. Osho...

Více

03 Exaktni metody a heuristika

03 Exaktni metody a heuristika Prostorem P na němž probíhá řešení, proložíme zametací nadrovinu (v 2E je to přímka, v 3E rozina), tuto nadrozvinu posouváme mezi krajními body P. Nadrovina rozděluje P na levý (v něm již byla úloh...

Více

Rozhranní člověk vs. stroj - jeden za všechny, všichni za

Rozhranní člověk vs. stroj - jeden za všechny, všichni za | Speciální ovládací klávesnice poskytuje plnou kontrolu živého prohlížení; zobrazení kamer, ovládání PTZ kamer a zpráva poplachů. | Grafické mapové rozhranní dovoluje plně funkční a intuitivní ovl...

Více

Studijní opora pro OOM

Studijní opora pro OOM Multimediální studijní podpora je spustitelná na každém počítači, který má nainstalovaný Macromedia Flash Player 7 a vyšší řady, který lze spustit bez hardwarových problémů. Taky je nutné mít kompl...

Více

multiset vrf, dc inverter r410a

multiset vrf, dc inverter r410a Argoclima S.p.A is an essential component of AER.FI. Group that, in only one decade has become one of the most important European structures for the production and the commercialization of air-cond...

Více

Pro pokročilé - Industry Online Support

Pro pokročilé - Industry Online Support Podprogram POLYPATH Pomocí příkazu POLYPATH(...) může být polynomická interpolace selektivně odblokována pro

Více

Assembly a jazyková interoperabilita

Assembly a jazyková interoperabilita Private Function Read (ByVal caption As String) As Double End Function Private Function discriminant (ByVal a As Double, _ ByVal b As Double, _ ByVal c As Double) _

Více