【问题标题】:modify filter_iterator predicate to accept two arguments (binary fn) in BOOST修改 filter_iterator 谓词以在 BOOST 中接受两个参数(二进制 fn)
【发布时间】:2014-02-08 21:58:15
【问题描述】:

参考我之前的问题here,我如何将另一个参数传递给谓词。例如这里是代码sn-p。

    // want this to take 2 arguments instead of one. (like a binary function)
    template < typename edge >
    struct isRequiredEdge {
    bool operator()( edge& e) {
    return true;
    }
    };

    // out_edge_iterators
    out_edge_it beg, end;
    boost::tie(beg, end) = boost::out_edges( v, G);
    typedef boost::filter_iterator< isRequiredEdge<ed_t>, out_edge_it > FilterIter;


    isRequiredEdge<ed_t> predicate;
    FilterIter ffirst ( predicate, beg, end  );
    FilterIter llast  ( predicate, end  );


    std::copy( ffirst, llast, std::ostream_iterator< ed_t > (std::cout, "  " ) );

在上面的代码中,它只需要一个参数(作为 edge_descriptor )。我想传递一个逻辑变量,例如一个 int 到谓词,并将边缘的边缘属性与 int 进行比较,并相应地返回 true 或 false。我知道如何访问边缘属性,但我无法将第二个参数传递给谓词。我知道它是一元谓词,但无法通过 ptr_fun 或 bind2nd 将第二个参数绑定到它。有人可以建议吗?

我可以打印所有边,但没有在上述谓词中插入实际逻辑,正如上面曾经注意到的那样。


这是我的函子:

    template < typename edge, typename graph >
    struct isRequiredEdge {
    isRequiredEdge( int t, graph& G ) : m_t(t), m_G(G) { }
    bool operator()( edge e ) {
    cout << " edge " << e << ": t = " << m_t  << endl;
    EdgeInfo* ei = &boost::get(EdgeInfoPropertyTag (), m_G, e ); 
    if(ei->time == m_t)
            return true;
    else 
          return false;
    }
    private:
       int m_t;
       graph m_G;

    };

    // out_edge_iterator
    boost::tie(beg, end) = boost::out_edges(*inf_it, G);

    // typedef filter_iterator for type out_edge_it
    typedef boost::filter_iterator< isRequiredEdge<ed_t, Graph>, out_edge_it > FilterIter;

    // create predicate object passing parameters such as time t and graph G.
    isRequiredEdge<ed_t, Graph> predicate(t, G);

    // define iterators here
    FilterIter ffirst ( predicate, beg, end  );
    FilterIter llast  ( predicate, end  );
    std::copy( ffirst, llast, std::ostream_iterator< ed_t > (std::cout, " " ) );

当 ffirst 创建时,仿函数正常工作并且输出如预期的那样。 当创建 llast 时,仿函数尝试获取图中不存在的任何随机边的信息( boost::get(NodeInfoPropertyTag ( ) ),因为发生了段错误。

有什么建议我如何在不发生这种情况的情况下创建 llast?

【问题讨论】:

  • 那么问题是你不知道如何正确绑定仿函数?
  • 是的,下面是我的仿函数代码,初始化 llast 时出现段错误。知道我该如何绕过这个吗?

标签: c++ boost iterator bind boost-graph


【解决方案1】:

将您的函子转换为接受两个参数,然后使用std::bind 或boost bind 为您返回一个函子,其中一个参数绑定到您想要的值。将此传递给您的迭代。

例如,如果您将仿函数签名更改为,

Operator()(int v, edge& e)

那么你的绑定就变成了

auto f = std::bind(isRequiredEdge<>::operator(), &predicate, 42, _1);

_1 是要传入的参数的占位符。

注意,如果你没有 c++11,你可以在上面的 sn-p 中用 boost 替换所有 std 的东西。

【讨论】:

  • 我确实将仿函数修改为以下内容,但我得到了这个分段错误,我知道它发生在哪里,但无法修复它。请参阅以下答案中的问题描述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2011-11-07
  • 2023-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多