3以下使用boost.1.46.1进行编译
#include <boost/graph/adjacency_list.hpp>
struct Node {
int id;
};
struct Edge {
int source;
int target;
int weight;
};
int main() {
/* an adjacency_list like we need it */
typedef boost::adjacency_list<
boost::setS, // edge container
boost::listS, // vertex container
boost::bidirectionalS, // directed graph
Node, Edge> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
Graph gp1;
std::cout << "Number of vertices 1: " << boost::num_vertices(gp1) << std::endl;
Vertex v1 = boost::add_vertex(gp1);
Vertex v2 = boost::add_vertex(gp1);
std::cout << "Number of vertices 2: " << boost::num_vertices(gp1) << std::endl;
gp1[v1].id = 3;
gp1[v2].id = 4;
Graph gp2(gp1);
std::cout << "Number of vertices 3: " << boost::num_vertices(gp2) << std::endl;
boost::remove_vertex(v2, gp2);
std::cout << "Number of vertices 4: " << boost::num_vertices(gp1) << std::endl;
std::cout << "Number of vertices 5: " << boost::num_vertices(gp2) << std::endl;
boost::graph_traits<Graph>::vertex_iterator it, end;
for (boost::tie( it, end ) = vertices(gp2); it != end; ++it) {
if ( gp2[*it].id == 3 ) {
boost::remove_vertex(*it, gp2);
}
}
std::cout << "Number of vertices 6: " << boost::num_vertices(gp1) << std::endl;
std::cout << "Number of vertices 7: " << boost::num_vertices(gp2) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gp2在删除它时如何知道v2:"boost :: remove_vertex(v2,gp2)"为什么gp1的顶点数减少1?
为什么它会给出一个分段错误:"boost :: remove_vertex(*it,gp2)",我该如何修复它?
小智 12
请注意,sehe的解决方案仅适用于具有VertexList = listS的图形,特别是不适用于VertexList = vecS的图形.另请注意,通常您不能存储顶点描述符或迭代器并在以后删除它们,因为这来自Boost Graph Library网站:
void remove_vertex(vertex_descriptor u,adjacency_list&g)
...如果adjacency_list的VertexList模板参数是vecS,则此操作将使图的所有顶点描述符,边描述符和迭代器无效.每个顶点的内置vertex_index_t属性被重新编号,以便在操作之后顶点索引仍然形成连续范围[0,num_vertices(g))....
您正在迭代它时修改顶点集合.
首先收集要删除的顶点,然后将其删除.或者使用以下模式:
// Remove all the vertices. This is OK.
graph_traits<Graph>::vertex_iterator vi, vi_end, next;
tie(vi, vi_end) = vertices(G);
for (next = vi; vi != vi_end; vi = next) {
++next;
remove_vertex(*vi, G);
}
Run Code Online (Sandbox Code Playgroud)
摘自此页面的示例:http://www.boost.org/doc/libs/1_47_0/libs/graph/doc/adjacency_list.html(这是google在您查找时返回的内容remove vertices boost graph)
快速翻译成您的样本:
boost::graph_traits<Graph>::vertex_iterator vi, vi_end, next;
boost::tie(vi, vi_end) = vertices(gp2);
for (next = vi; vi != vi_end; vi = next) {
++next;
if (gp2[*vi].id == 3)
remove_vertex(*vi, gp2);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Number of vertices 1: 0
Number of vertices 2: 2
Number of vertices 3: 2
Number of vertices 4: 1
Number of vertices 5: 2
Number of vertices 6: 1
Number of vertices 7: 1
Run Code Online (Sandbox Code Playgroud)
没有更多的崩溃:)
| 归档时间: |
|
| 查看次数: |
9941 次 |
| 最近记录: |