【发布时间】: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