Miniheap lambda използвайки std::map

За присвояване трябва да направим клас MiniHeap, който използва std::map, за да свърже входните команди на потребителя с ламбда. Тези команди управляват std::vector с основни неща (push_back, pop_back, collect и т.н.). Единственият проблем, който имам, е функцията за добавяне. Потребителят трябва да може да въведе „добавяне на 123“, така че „123“ да бъде избутано обратно във вектора. Текущият ми код:

class MiniHeap
{
public:
    MiniHeap()
    {
    // Make an add lambda that  recognizes part of it's key as "add" and proceeds to recognize it's numerical part, convert it to an int and then adds it to m_Vector.
    std::function<void()> add = [&](){};
    std::function<void()> list = [&](){for (int i = 0; i < m_Vector.size(); ++i){ std::cout << m_Vector.at(i) << std::endl; }};
    std::function<void()> pop = [&](){m_Vector.pop_back(); };
    std::function<void()> sum = [&](){std::cout << std::accumulate(m_Vector.begin(), m_Vector.end(), 0) << std::endl; };

    }
    void Execute(const std::string & command)const
    {
        auto cmd = m_Commands.find(command);
        if (cmd != m_Commands.end())
        {
            cmd->second();
        }
    }
private:
    std::vector<int> m_Vector;
    std::map<std::string, std::function<void()>> m_Commands;
};

int main()
{
    //MiniHeap
    MiniHeap heap;
    for (;;)
    {
        std::string command;
        std::cout << "> ";
        std::cin >> command;
        heap.Execute(command);
    }

    std::cin.get();
    return 0;
}

Уловката: имам право да променям само конструктора на класа MiniHeap. Коментирах частта, с която имам проблеми, в конструктора MiniHeap. Как може std::find да работи върху низ, който има част "add" и числова стойност?

Много благодаря предварително.


person Emvidasch    schedule 22.02.2015    source източник
comment
Трябва да поставите имената, напр. "add" и съответната функция, напр. add в картата - което трябва да е изпълнимо в конструктора.   -  person Mats Petersson    schedule 22.02.2015


Отговори (1)


Трудният момент може би е, че приемате, че инструкцията:

std::cin >> command;

ще прочете целия вход наведнъж. Всъщност ще спре при първото празно място. Знаейки това, трябва да можете да приложите add, като използвате същия метод като по-горе, за да получите оставащото число във входния поток.

person didierc    schedule 22.02.2015
comment
Наистина предположих, че ще прочете целия ред. Знаейки, че всичко, което трябва да направя, е да разбера как да вкарам оставащото число там. Оценявам го. - person Emvidasch; 22.02.2015