bad_function_call при использовании лямбда-функции на boost: heap - PullRequest
0 голосов
/ 11 января 2019

Я хочу создать структуру данных кучи, чтобы иметь возможность обновлять значение. но мой простой код ниже выдает исключение. почему это дает следующее:
109 : 3 terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call

#include <set>
#include <algorithm>
#include <functional>

#include <boost/heap/fibonacci_heap.hpp>

int main() {

    // Creating & Initializing a map of String & Ints
    std::map<int, vector<int> > mapOfWordCount = { { 1000, {0,1,10,8} },  { 10001, {1,5,99} },  { 1008, {7,4,1} } ,  { 109, {1,5,3} }};

    // Declaring the type of Predicate that accepts 2 pairs and return a bool
    typedef std::function<bool(std::pair<int, vector<int> > v1, std::pair<int, vector<int> > v2)> Comparator;

    // Defining a lambda function to compare two pairs. It will compare two pairs using second field
    Comparator compFunctor = 
        [](std::pair<int, vector<int> > elem1 ,std::pair<int, vector<int> > elem2)
        {
            return elem1.second.size() > elem2.second.size();
        };

    boost::heap::fibonacci_heap <std::pair<int, vector<int> >, boost::heap::compare<Comparator> > pq;
    typedef boost::heap::fibonacci_heap< std::pair<int, vector<int> >, boost::heap::compare<Comparator> >::handle_type handle_t;

    handle_t* tab_handle = new handle_t [mapOfWordCount.size()];
    unsigned iter(0);
    for( auto& element : mapOfWordCount) {
        tab_handle[iter++]=pq.push(element);
        std::cout << element.first << " : " << element.second.size() << std::endl;
    }
}

1 Ответ

0 голосов
/ 11 января 2019

std::bad_function_call исключение (в данном случае) вызывается при вызове std::function, который пуст.

Я сделал эту работу, сделав Comparator функтором.

struct Comparator
{
    bool operator()(std::pair<int, std::vector<int> > elem1, std::pair<int, std::vector<int> > elem2) const
    {
        return elem1.second.size() > elem2.second.size();
    }
};

Это может затем использоваться в объявлениях pq и handle_t.

Выход:

109 : 3  
1000 : 4  
1008 : 3  
10001 : 3  

См. Демо здесь .

Вы можете понять, как заставить его работать с лямбдой.
Подсказка: Сюда входит использование лямбды compFunctor в качестве аргумента для построения.

...