我使用boost::filter_iterator
来过滤一对增强图顶点,如下所示:
我使用vertex_iterator
对<vbegin, vend>.
有一系列图顶点
我想使用谓词过滤范围,并且需要对范围进行分组
说4个子范围
<begin1, end1> ... <begin4, end4>
所以我使用boost::filter_iterator
过滤顶点迭代器并创建4个子范围。
这种子范围迭代器对需要插入容器(矢量)
std::vector< pair<filter_iterator, filter_iterator> > my_vector
size of vector = 4 (because 4 pairs are inserted)
具有给定所需参数的过滤谓词有助于定义过滤器迭代器范围
<fbegin, fend>
代码如下:
template<typename Graph>
struct my_filter_pred {
public:
my_filter_pred() { }
my_filter_pred(Graph& _G, int _value) : G(_G), value(_value) { }
template<typename vertex_t>
bool operator() (vertex_t vertex) {
//get property "p" of vertex in graph G
auto p = get (mypropertytype, vertex, G);
return (p.val == value);
}
private:
Graph& G;
}
//get all vertices using vertex iterator
vertex_iterator vbegin, vend;
boost::tie(vbegin, vend) = boost::vertices(G);
for循环如下“
//for each i = 0,1,2,3 -> create a predicate with i as parameter.
//apply the filter predicate over the vertex_iterator range
//insert in the begin, end pair into vector
for (int i=0; i<4; ++i)
{
//for each i, create a filter_pred
my_filter_pred <Graph> filter_pred(G, i)
//now create begin and end filter iterators as follows
auto fbegin = boost::make_filter_iterator< my_filter_pred<Graph>,
vertex_iterator> (filter_pred, vbegin, vend)
auto fend = boost::make_filter_iterator< my_filter_pred<Graph>,
vertex_iterator> (filter_pred, vend, vend)
//fbegin, fend are of type filter iterator
//insert the iterator pair into vector
my_vector.push_back( std::make_pair (fbegin, fend) );
}
现在:问题测试部分:
我正在使用2个编译器gcc4.9和Inter 13.0.1来测试此代码。
结果:
gcc 4.9 --> works correctly, compiles fine and works fine as well.
icpc gives me the following error:
error: implicitly generated assignment operator cannot copy:
reference member "my_filter_pred <Graph>::G [with ... ]"
struct my_filter_pred { ^ 检测期间:
我用Google搜索了错误,我在intel的网站here上找到了这个链接 关于相同的错误,但没有提供此类错误的信息。
我该如何解决这个问题?我尝试将以下内容添加到我的谓词(函数对象)
中 my_filter_pred& operator=(const my_filter_pred&);
my_filter_pred(const my_filter_pred&);
但之后我得到了“未定义的引用....”错误。如何显式定义复制赋值运算符和复制构造函数
答案 0 :(得分:1)
由于您在谓词Graph& G
中使用引用my_filter_pred
,后者是可复制构建的,但不能由operator =分配。但是你需要在code.gnable的许多地方使用operator =。
我建议更改代码如下
模板
struct my_filter_pred {
上市:
my_filter_pred(){}
my_filter_pred(Graph&amp; _G,int _value):G(&amp; _G),value(_value){}
template<typename vertex_t>
bool operator() (vertex_t vertex) {
//get property "p" of vertex in graph G
auto p = get (mypropertytype, vertex, *G);
return (p.val == value);
}
private:
Graph* G;
}
现在过滤谓词是可复制的。