REČNIK PODATAKA - MAPE U C++
Mape u C++ su kolekcije podataka koje čuvaju podatke čijim vrednostima se pristupa pomoću jedinstvenog ključa. To je zapravo rečnik podataka i deklariše se na sledeći način:
map<tip_ključa,tip_vrednosti>naziv_mape;
map<tip_ključa,tip_vrednosti>naziv_mape;
Posmatrajmo sledeći problem:
Zadati imena grupe učenika u jednom odeljenju. Uneti njihove prosečne ocene na kraju školske godine. odrediti prosek grupe i odrediti koliko je učenika postiglo uspeh iznad prosečnog
Rešenje: ovaj primer ćemo rešiti upotrebom mapa, tako što će se za ključ upotrebiti ime učenika, a kao vrdnost unutar mape smestiti njihov uspeh.
Da bi koristili mape u C++ unutar fajla mora se uključiti datoteka zaglavlja map:
Rešenje: ovaj primer ćemo rešiti upotrebom mapa, tako što će se za ključ upotrebiti ime učenika, a kao vrdnost unutar mape smestiti njihov uspeh.
Da bi koristili mape u C++ unutar fajla mora se uključiti datoteka zaglavlja map:
#include < map >
Zatim je potrebno deklarisati mapu:
map < string, double> prosek;
Vidimo da će tipovi za ključeve biti string i to se odnosi na imena učenika, dok će tipovi vrednosti biti double, s obzirom da su vrednosti u stvari prosečne ocene, dakle, realni brojevi.
Inicijalizacija mape
Jedan od načina da mapu popunimo sa vrednostima je da je inicijalizujemo i to je slučaj kada unapred znamo podatke o učenicima, njihova imena i ostvarene uspehe, tj. njihove prosečne ocene na kraju godine.
prosek={
{"Mika",4.52},
{"Milica",4.78},
{"Nikola",3.89 }
};
{"Milica",4.78},
{"Nikola",3.89 }
Iteracije kroz mapu c++
U svakom ciklusu petlje se uzima sledeći par koji sadrži i ključ i vrednost(Ime učenika i prosek). Pristup ključu se ostvaruje pomoću atributa first, dok se pristup vrednosti ostvaruje pomoću atributa second.
//ispisivanje podataka smeštenih unutar mape
for(auto parKljucVrednost: prosek){
for(auto parKljucVrednost: prosek){
cout << parKljucVrednost.first << " " << parKljucVrednost.second << endl;
}Učitavanje mape c++
Drugi način da se mapa popuni vrednostima je učitavanje sa standardnog ulaza, kada se od korisnika zatraži da unese ime učenika, kao i njegov ostvaren uspeh.
Unošenje para kluč vrednost, može se dodati u mapu na njen kraj sa funkcijom insert. Posmatrajmo sledeći kod:
Unošenje para kluč vrednost, može se dodati u mapu na njen kraj sa funkcijom insert. Posmatrajmo sledeći kod:
//Ucitavanje para kljuc vrednost u mapu
int n;
string ime;
double prosek;
cout << " Unesi broj ucenika" << endl;
cin >> n;
for(int i = 0; i
//ispisivanje podataka smeštenih unutar mape
for(auto parKljucVrednost: prosek){
int n;
string ime;
double prosek;
cout << " Unesi broj ucenika" << endl;
cin >> n;
for(int i = 0; i
cout << "Unesi ime ucenika " << endl;
cin >> ime;
cout << "unesi prosek " << endl;
cin >> prosek;
prosekMap.insert(pair (ime,prosek));
}cin >> ime;
cout << "unesi prosek " << endl;
cin >> prosek;
prosekMap.insert(pair
//ispisivanje podataka smeštenih unutar mape
for(auto parKljucVrednost: prosek){
cout << parKljucVrednost.first << " " << parKljucVrednost.second << endl;
}Prepisivanje iz jedne mape u drugu c++
Deklariše se mapa prosekMap2 koja će imati iste elemente kao i mapa 1. Prilikom deklarisanja treba proslediti pokazivače na početak i kraj prve mape.
//prepisivanje mape
cout << "Mapa 2: "<< endl;
map < string, double>prosekMap2(prosekMap.begin(),prosekMap.end());
ispisi(prosekMap2);
cout << "Mapa 2: "<< endl;
map < string, double>prosekMap2(prosekMap.begin(),prosekMap.end());
ispisi(prosekMap2);
Ovde smo ispisivanje vrednosti mape premestili u posebnu funkciju ispisi, kojoj se za parametar prosleđuje pokazivač na mapu koju treba ispisati.
void ispisi(map < string, double> prosekMap){
//ispisivanje podataka smeštenih unutar mape
for(auto parKljucVrednost: prosek){
}for(auto parKljucVrednost: prosek){
cout << parKljucVrednost.first << " " << parKljucVrednost.second << endl;
}Posle pokretanja:
Ispisivanje mape pomoću iteratora
Definišemo iterator (kursor) koji pokazuje na određen par unutar mape i može lako da se premešta kroz mapu:
map<string, double>::iterator itr;
Ispisivanje kroz petlju bi bilo:
map<string, double>::iterator itr;
Ispisivanje kroz petlju bi bilo:
void ispisi2(map < string, double> prosekMap){
//ispisivanje podataka smeštenih unutar mape
map < string, double>::iterator itr;
for(itr = prosekMap.begin(); itr !=prosekMap.end(); ++itr ){
}map < string, double>::iterator itr;
for(itr = prosekMap.begin(); itr !=prosekMap.end(); ++itr ){
cout << itr -> first << " " << itr -> second << endl;
}Brisanje elemenata u mapi c++
Brisanje elemenata iz mape se može ostvariti funkcijom erase
Brisanje elemenata sa odrećenom vrednošću ključa
Ako želimo da obrišemo element čiji je ključ npr vrednost imeZaBrisanje, to se može uraditi na sledeći način:
//Brisanje elemenata sa odrećenom vrednošću ključa
string imeZaBrisanje = "Nikola";
prosekMap2.erase(imeZaBrisanje);
cout << "Posle brisanja, mapa 2 izgleda " << endl;
ispisi2(prosekMap2);
string imeZaBrisanje = "Nikola";
prosekMap2.erase(imeZaBrisanje);
cout << "Posle brisanja, mapa 2 izgleda " << endl;
ispisi2(prosekMap2);
Brisanje svih elemenata u mapi
//Brisanje elemenata sa odrećenom vrednošću ključa
prosekMap2.clear();
cout << "Posle brisanja, komandom clear broj elemenata u mapi 2 je " << prosekMap2.size();
prosekMap2.clear();
cout << "Posle brisanja, komandom clear broj elemenata u mapi 2 je " << prosekMap2.size();
Posle brisanja mapa 2 neće imati ni jedan element, tj. veličina mape je nula.
Pronalaženje vrednosti po kljucu c++
Ukoliko se zna kljuc, prvo se pomocu find funkcije vrati iterator koji pokazuje na onaj par ciji je ključ prosledjen funkciji. Zatim se pomoću iteratora može izvući vrednost, kao što je pokazano u sledećem kodu:
//pretraga mape
string kljuc="Mika";
map::iterator it;
it=prosekMap.find(kljuc);
cout << endl << it -> first << " ima prosek " << it->second;
string kljuc="Mika";
map
it=prosekMap.find(kljuc);
cout << endl << it -> first << " ima prosek " << it->second;
Sortiranje mape po vrednosti
Prvo treba prebaciti elemente u vector:
// Deklarisanje vektora parova iz mape
vector < pair < string, double > > A;
// Copy key-value pair from Map
// to vector of pairs
for (auto& it : prosekMap) {
vector < pair < string, double > > A;
// Copy key-value pair from Map
// to vector of pairs
for (auto& it : prosekMap) {
A.push_back(it);
}Zatim se vrši sortiranje funkcijom sort
sort(A.begin(),A.end());
cout << " Posle sortiranja mapa izgleda: " << endl;
ispisi(prosekMap);
cout << " Posle sortiranja mapa izgleda: " << endl;
ispisi(prosekMap);
Posle pokretanja:
PRIMER SA UPOTREBOM MAPA: Pogledajte primer broj 11 sa webstrane: Kvalifikacije za okružna takmičenja