Uvećaj sve elemente skupa
Napisati generičku klasu mapa<K, V> koja implementira mapu parova tipa std::pair<K, V>. Klasa treba da podržava sledeće operacije:
void dodaj(const K& kljuc, const V& vrednost)- dodaje par (kljuc, vrednost) u mapu. Ako je kljuc već prisutan, ažurira njegovu vrednost.V vrednost(const K& kljuc) const- vraća vrednost povezanu sa datim ključem. Ako ključ nije prisutan, baca izuzetakstd::out_of_range.void ukloni(const K& kljuc)- uklanja par sa datim ključem iz mape. Ako ključ nije prisutan, ne radi ništa.void uvecaj(const K& kljuc, const V& delta)- uvećava vrednost povezanu sa datim ključem za iznos delta. Ako ključ nije prisutan, baca izuzetakstd::out_of_range.void uvecaj_sve(const V& delta)- uvećava sve vrednosti u mapi za dati iznos delta.
Sve operacije treba da budu složenosti ne veće od
Ulaz
Sa standardnog ulaza, sve do kraja ulaza, učitavaju se naredbe u formatu:
a k v- dodaje par (k, v) u mapuv k- ispisuje vrednost za ključ ku k d- uvećava vrednost za ključ k za di d- uvećava sve vrednosti za dr k- uklanja par sa ključem k
Izlaz
Na standardni izlaz ispisati rezultate izvršavanja naredbi v k. Ako neka naredba baci izuzetak, ispisati poruku izuzetka na standardni izlaz za greške.
Primer
stdin
a 1 10
a 2 20
v 1
i 5
v 2
u 1 3
v 1
r 2
v 2
stdout
10
25
18
stderr
Kljuc nije pronadjen
Rešenje
main.cpp
#include <iostream>
#include <map>
namespace matf
{
/* Klasa za mapu sa uvecavanjem svih vrednosti */
template <typename K, typename V>
class mapa
{
public:
/* Dodaje par (key, value) u mapu */
void dodaj(const K& key, const V& value)
{
elementi[key] = value - uvecanje;
}
/* Vraca vrednost za dati kljuc */
V vrednost(const K& key) const
{
auto it = elementi.find(key);
if (it == elementi.end()) {
throw std::out_of_range("Kljuc nije pronadjen u mapi");
}
return it->second + uvecanje;
}
/* Uvecava sve vrednosti za delta */
void uvecaj_sve(const V& delta)
{
uvecanje += delta;
}
/* Uvecava vrednost za dati kljuc za inc */
void uvecaj(const K& key, const V& delta)
{
auto it = elementi.find(key);
if (it == elementi.end()) {
throw std::out_of_range("Kljuc nije pronadjen u mapi");
}
it->second += delta;
}
/* Uklanja par sa datim kljucem */
void ukloni(const K& key)
{
elementi.erase(key);
}
private:
std::map<K, V> elementi;
V uvecanje = 0;
};
};
int main(void)
{
matf::mapa<int, int> m;
char op;
while (std::cin >> op) {
if (op == 'a') {
int k, v; std::cin >> k >> v;
m.dodaj(k, v);
} else if (op == 'v') {
int k; std::cin >> k;
try {
int v = m.vrednost(k);
std::cout << v << std::endl;
} catch (const std::out_of_range& e) {
std::cerr << e.what() << std::endl;
}
} else if (op == 'u') {
int k, delta; std::cin >> k >> delta;
m.uvecaj(k, delta);
} else if (op == 'i') {
int delta; std::cin >> delta;
m.uvecaj_sve(delta);
} else if (op == 'r') {
int k; std::cin >> k;
m.ukloni(k);
}
}
return 0;
}