Naredni element skupa

Napisati generičku klasu skup<T> koja implementira skup elemenata tipa T. Klasa treba da podržava sledeće operacije:

Ulaz

Sa standardnog ulaza, sve do kraja ulaza, učitavaju se naredbe u formatu:

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;
}