#include <iostream>
#include <complex>
#include <map>

struct Level
{
    long double coefficient;
    size_t exponent;

    Level(long double ld = 0, size_t s = 0): //default: Summe, 0
    coefficient(ld), exponent(s) {}

    long double operator()(long double x)
    {
            return coefficient * std::pow(x, exponent);
    }
};

bool operator<(Level const& a, Level const& b)
{
        return a.exponent < b.exponent;
}
bool operator==(Level const& a, Level const& b)
{
        return a.exponent == b.exponent;
}

//Template-Meta Version?
class Polynom
{
    std::map<size_t, Level> mLevels;//Redundanz-Pegel: 4/10 :D
    size_t const mNLevel;

public:

        template<typename it_t>
        Polynom(it_t a, it_t b):
        mLevels(a, b),
        mNLevel(mLevels.size()) {}

        long double operator()(long double X)
        {
                long double sum(0);
                for(size_t a(0) ; a < mLevels.size(); ++a) //Range-Based for in C++11 - bin zu faul zum iterieren :p
                        sum += mLevels[a](X);

                return sum;
        }
};

int main()
{
        std::map<size_t, Level> v;
        v[2] = 3;
        v[1] = 9;
        v[0] = 3.41;
	//Die Funktion lautet: 3x zum Quadrat + 2x + 3.41

        Polynom p(v.begin(), v.end());

        std::cout << p(1) << '\n';
}