Naredni element skupa
Napisati generičku klasu skup<T> koja implementira skup elemenata tipa T. Klasa treba da podržava sledeće operacije:
void dodaj(const T& element)- dodaje element u skup. Ako je element već prisutan, ne radi ništa.void ukloni(const T& element)- uklanja element iz skupa. Ako element nije prisutan, ne radi ništa.bool sadrzi(const T& element) const- proverava da li skup sadrži dati element.const T& naredni(const T& element) const- vraća naredni element u skupu koji je veći od datog elementa. Ako ne postoji veći element, baca izuzetakstd::out_of_range.
Ulaz
Sa standardnog ulaza, sve do kraja ulaza, učitavaju se naredbe u formatu:
a x- dodaje elementxu skupr x- uklanja elementxiz skupan x- ispisuje naredni element veći odxili izuzetak ako ne postoji
Izlaz
Sa standardnog izlaza ispisati rezultate izvršavanja naredbi n x. Ako naredba baci izuzetak, ispisati poruku izuzetka na standardni izlaz za greške.
Primer
stdin
a 5
a 10
a 3
n 5
r 10
n 5
stdout
10
stderr
Nema narednog elementa
Rešenje
main.cpp
#include <iostream>
#include <set>
namespace matf
{
/* Klasa za skup */
template <typename T>
class skup
{
public:
/* Dodaje element u skup */
void dodaj(const T& x)
{
elementi.insert(x);
}
/* Uklanja element iz skupa */
void ukloni(const T& x)
{
elementi.erase(x);
}
/* Proverava da li skup sadrzi dati element */
bool sadrzi(const T& x) const
{
return elementi.find(x) != elementi.end();
}
/* Vraca naredni element veci od x */
const T& naredni(const T& x) const
{
auto it = elementi.upper_bound(x);
if (it == elementi.end()) {
throw std::out_of_range("Nema narednog elementa");
}
return *it;
}
private:
std::set<T> elementi;
};
};
int main(void)
{
matf::skup<int> s;
char op;
while (std::cin >> op) {
if (op == 'a') {
int x; std::cin >> x;
s.dodaj(x);
} else if (op == 'r') {
int x; std::cin >> x;
s.ukloni(x);
} else if (op == 'n') {
int x; std::cin >> x;
try {
int y = s.naredni(x);
std::cout << y << std::endl;
} catch (const std::out_of_range& e) {
std::cerr << e.what() << std::endl;
}
}
}
return 0;
}