gpt4 book ai didi

c++ - boost图形库: named_graph and remove_vertex

转载 作者:行者123 更新时间:2023-12-03 12:51:48 25 4
gpt4 key购买 nike

我正在尝试使用named_graph mixin,我有点困惑remove_vertex()应该如何工作。

#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/graph/adjacency_list.hpp>

struct vertex_info {
std::string name; // uses vertex_from_name<vertex_info>
vertex_info(const std::string &name_) : name(name_) { }
};

ostream& operator<<(ostream & os, const vertex_info &v)
{
os << v.name;
return os;
}

namespace boost { namespace graph {

template<typename Type>
struct vertex_name_extractor
{
typedef Type type;
typedef const std::string& result_type;
result_type operator()(const Type& v) const
{
return v.name;
}
};

template<>
struct internal_vertex_name<vertex_info>
{
typedef vertex_name_extractor<vertex_info> type;
};

template<>
struct internal_vertex_constructor<vertex_info>
{
typedef vertex_from_name<vertex_info> type;
};

} }

typedef adjacency_list< vecS, vecS, undirectedS, vertex_info, edge_info> graph_t;

namespace bg=boost::graph;
int main()
{
using namespace std;
graph_t g;

int i;
typedef graph_traits<graph_t>::vertex_descriptor vert;

for(i=0;i < 10;++i)
{
string t_name("Vertex");
vert V;
t_name += lexical_cast<string>(i);
V = add_vertex(t_name,g);
}

typedef graph_t::vertex_name_type name_t;
name_t s_temp("Vertex2");

optional<vert> V(
find_vertex(s_temp,g));

if( V ) {
cout << "Found vertex:" << *V << '\n';
//remove_vertex(*V,g); // (1)
//remove_vertex(vertex(*V,g),g); // (2)
//remove_vertex(g[*V],g); // (3)
//remove_vertex(s_temp,g); // (4)
} else {
cout << "Vertex not found\n";
}


graph_traits<graph_t>::vertex_iterator v_i, v_end;

for(tie(v_i,v_end) = vertices(g); v_i != v_end; ++v_i)
{
cout << '\'' << g[*v_i] << '\'' << endl;;
}
}

当我尝试使用 (3) 或 (4) 时,出现错误,因为没有匹配的函数调用“remove_vertex(vertex_info&, graph_t&)”

adjacency_list.hpp:2211 个候选者:remove_vertex(typename graph_t::vertex_descriptor, graph_t &)

但是当我尝试使用 (1) 或 (2) 时,我收到了从“long unsigned int”到“const char*”无效转换的错误。

  error:   initializing argument 1 of ‘std::basic_string<...'
boost/graph/named_graph.hpp:349
template<BGL_NAMED_GRAPH_PARAMS>
inline void BGL_NAMED_GRAPH::removing_vertex(Vertex vertex)
{
named_vertices.erase(vertex); //line 349
}

最佳答案

vertex_name 提取器的 result_type 应删除 const 和引用限定符。函数对象应指定它返回 const 引用。这允许依赖于 result_type 的正确元函数,而无需删除它们。可以更轻松地指定重载仿函数。

template<typename Type>
struct vertex_name_extractor
{
typedef Type type;
typedef std::string result_type;
const result_type& operator()(const Type& v) const
{
return v.name;
}
} ;

如果我们指定自己的构造函数,则可以更轻松地扩展创建捆绑的 VertexProperty。

template<typename VertexProperty>                                                         
struct vertex_info_constructor
{
typedef VertexProperty return_type;
typedef typename vertex_name_extractor<VertexProperty>::result_type argument_type;
return_type operator()(argument_type n)
{
VertexProperty v(n);
return v;
}
};

template<>
struct internal_vertex_constructor<vertex_info>
{
typedef vertex_info_constructor<vertex_info> type;
};

adjacency_list 使用 MI mixin,其基类 Maybe_named_graph<>。按照当internal_vertex_name::type为void时关闭named_graphs的示例,我添加了部分特化 Maybe_name_graph::type > 如下:

template<typename Graph, typename Vertex>
struct maybe_named_graph<Graph, Vertex, vertex_info, vertex_name_extractor<vertex_info> >
: public named_graph<Graph, Vertex, vertex_info>
{
typedef named_graph<Graph, Vertex, vertex_info> Base;
//maybe_named_graph() { }

typedef typename detail::extract_bundled_vertex<vertex_info>::type
bundled_vertex_property_type;

void added_vertex(Vertex v) { Base::added_vertex(v); }

void removing_vertex(Vertex v) {
const std::string &name = extract_name((Base::derived()[v]));
Base::named_vertices.erase(name);
}

void clearing_graph() { Base::clearing_graph(); }

optional<Vertex>
vertex_by_property(const bundled_vertex_property_type& t)
{
return Base::vertex_by_property(t);
}
};

现在adjacency_list的remove_vertex( VertexDescriptor, Graph )调用我专门的removing_node,它通过顶点描述符从named_graph中删除vertex_name。

注意:使用了vecS,所以你仍然要小心迭代器失效。

关于c++ - boost图形库: named_graph and remove_vertex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7315687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com