在boost:heap上使用lambda函数时,bad_function_call

时间:2019-01-10 23:45:56

标签: c++11 boost lambda functor

我想创建一个堆数据结构以能够更新值。 但是我下面的简单代码引发了异常。为什么给出以下内容:
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 :(得分:1)

调用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();
    }
};

然后可以在pqhandle_t的声明中使用它。

输出:

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

请参见演示here

您可以弄清楚如何使用lambda进行操作。
提示::它涉及使用lambda compFunctor作为构造参数。