我使用 python库生成以下GraphViz .dot文件.

http://pastebin.com/mL7ck9Zp

我现在想把它读成C的Boost :: Graph,这样我就可以使用Boost :: Graph的库算法了.

但是,我需要做一些预处理.特别是,我想用字符串构造函数创建一个捆绑属性,并让read_graphviz()将点文件中label字段中的字符串传递给字符串构造函数.

我该怎么做呢?

解决方法

首先要意识到的是,Boost文档样本几乎总是引用/从实际样本生成: libs/graph/example/read_graphviz.cpp

要意识到的第二件事是BGL非常通用.高度.它在Boost Property Maps的概念上实现了很多这种通用性.

最后,观察从“自由形式”(至少动态/无类型文本形式)解析为某种通用MutableGraph模型正在推动极限.

这解释了如何阅读the docs for property_map下的文档的重要部分.

无论如何,因为the sample确实有点过时了,请允许我证明:

>将解析器的实现包含在一个翻译单元中:

#include <libs/graph/src/read_graphviz_new.cpp>

这样BGL仍然是一个只有头的库.
>这些天喜欢捆绑的属性:

struct Vertex {
    std::string name,label,shape;
};

struct Edge {
    std::string label;
    double weight; // perhaps you need this later as well,just an example
};

typedef property<graph_name_t,std::string> graph_p;
typedef adjacency_list<vecS,vecS,directedS,Vertex,Edge,graph_p> graph_t;

我们将填充顶点和边的标签,形状,名称.
>动态属性映射是魔术发生的地方:

dynamic_properties dp/*(ignore_other_properties)*/;

此类提供对由(name,typeid(key_type))标识的各种底层property maps的类型擦除访问.

这意味着您可以注册捆绑的属性,并将它们映射到graphviz属性名称:

int main() {
    // Construct an empty graph and prepare the dynamic_property_maps.
    graph_t graph(0);

    dynamic_properties dp(ignore_other_properties);
    dp.property("node_id",get(&Vertex::name,graph));
    dp.property("label",get(&Vertex::label,graph));
    dp.property("shape",get(&Vertex::shape,get(&Edge::label,graph));

That’s really all there is to it. (Read up on the 07006,found via the 07007).

虽然我们不需要它,但我们也将图形属性抛出混合(如文档示例中所示):

// Use ref_property_map to turn a graph property into a property map
    boost::ref_property_map<graph_t *,std::string> gname(get_property(graph,graph_name));
    dp.property("name",gname);

>现在剩下的就是阅读图表了.

好.好吧.让我们把它写回来,但是使用新的图形名称,然后:

std::ifstream dot("input.dot");

if (read_graphviz(dot,graph,dp/*,"node_id"*/)) {
    std::cout << "Graph name: '" << get_property(graph,graph_name) << "'\n";
    get_property(graph,graph_name) = "Let's give it a name";
    write_graphviz_dp(std::cout,"node_id"*/);
}

>不要忘记链接到Boost Regex

完整的演示

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/property_map/dynamic_property_map.hpp>
#include <libs/graph/src/read_graphviz_new.cpp>
#include <boost/graph/graph_utility.hpp>

using namespace boost;

struct Vertex {
    std::string name,graph_p> graph_t;

int main() {
    // Construct an empty graph and prepare the dynamic_property_maps.
    graph_t graph(0);

    dynamic_properties dp/*(ignore_other_properties)*/;
    dp.property("node_id",graph));

    // Use ref_property_map to turn a graph property into a property map
    boost::ref_property_map<graph_t *,gname);

    std::ifstream dot("input.dot");

    if (read_graphviz(dot,"node_id"*/)) {
        std::cout << "Graph name: '" << get_property(graph,graph_name) << "'\n";
        get_property(graph,graph_name) = "Let's give it a name";
        write_graphviz_dp(std::cout,"node_id"*/);
    }
}

打印(注意之前的空名称和更新的图形名称属性,之后):

Graph name: ''
digraph G {
name="Let's give it a name";
n0 [label="A9\n",shape=Box];
n1 [label="- [0.48%,19.42%]",shape=ellipse];
n11 [label="+ [0%,0%]",shape=ellipse];
n12 [label="- [0%,0.75%]",shape=ellipse];
n13 [label="+ [0.03%,1.33%]",shape=ellipse];
n14 [label="- [0%,shape=ellipse];
n15 [label="+ [0%,shape=ellipse];
n16 [label="+ [0%,shape=ellipse];
n17 [label="A14\n",shape=Box];
n18 [label="+ [0.03%,2.51%]",shape=ellipse];
n19 [label="A15\n",shape=Box];
n2 [label="A15\n",shape=Box];
n20 [label="A6\n",shape=Box];
n21 [label="A2\n",shape=Box];
n22 [label="- [0%,1.11%]",shape=ellipse];
n23 [label="+ [0%,1%]",shape=ellipse];
n25 [label="- [0%,2.18%]",shape=ellipse];
n26 [label="+ [0%,1.79%]",shape=ellipse];
n27 [label="- [0%,shape=ellipse];
n28 [label="- [0%,shape=ellipse];
n29 [label="- [0%,shape=ellipse];
n3 [label="A11\n",shape=Box];
n30 [label="- [0%,shape=ellipse];
n31 [label="- [0%,shape=ellipse];
n32 [label="- [0%,shape=ellipse];
n33 [label="A13\n",shape=Box];
n34 [label="+ [0%,shape=ellipse];
n35 [label="- [0%,shape=ellipse];
n36 [label="- [0.01%,1.21%]",shape=ellipse];
n38 [label="A12\n",shape=Box];
n39 [label="- [0%,shape=ellipse];
n4 [label="A4\n",shape=Box];
n40 [label="+ [0%,1.17%]",shape=ellipse];
n42 [label="- [0%,shape=ellipse];
n43 [label="A12\n",shape=Box];
n44 [label="+ [0%,shape=ellipse];
n45 [label="- [0%,shape=ellipse];
n47 [label="- [0%,shape=ellipse];
n49 [label="+ [0%,shape=ellipse];
n5 [label="+ [0%,shape=ellipse];
n52 [label="+ [0%,shape=ellipse];
n54 [label="A13\n",shape=Box];
n55 [label="A14\n",shape=Box];
n56 [label="- [0.03%,2.5%]",shape=ellipse];
n57 [label="+ [0.01%,2.27%]",shape=ellipse];
n59 [label="- [0%,shape=ellipse];
n6 [label="A7\n",shape=Box];
n60 [label="+ [0%,shape=ellipse];
n63 [label="A15\n",shape=Box];
n64 [label="+ [0.05%,1.34%]",shape=ellipse];
n65 [label="A15\n",shape=Box];
n66 [label="- [0%,shape=ellipse];
n67 [label="+ [0.02%,2.44%]",shape=ellipse];
n7 [label="A14\n",shape=Box];
n71 [label="+ [0.21%,3.83%]",shape=ellipse];
n8 [label="+ [0%,1.57%]",shape=ellipse];
n9 [label="- [0.01%,1.22%]",shape=ellipse];
n0->n1  [label=f];
n0->n2  [label=t];
n17->n18  [label="<=110"];
n17->n19  [label=">110"];
n19->n20  [label="<=8"];
n19->n49  [label=">8"];
n2->n3  [label="<=228"];
n2->n71  [label=">228"];
n20->n21  [label=aa];
n20->n25  [label=c];
n20->n26  [label=cc];
n20->n27  [label=d];
n20->n28  [label=e];
n20->n29  [label=ff];
n20->n30  [label=i];
n20->n31  [label=j];
n20->n32  [label=k];
n20->n33  [label=m];
n20->n38  [label=q];
n20->n42  [label=r];
n20->n43  [label=w];
n20->n47  [label=x];
n21->n22  [label="<=41"];
n21->n23  [label=">41"];
n3->n4  [label="<=3"];
n3->n63  [label=">3"];
n33->n34  [label=g];
n33->n35  [label=p];
n33->n36  [label=s];
n38->n39  [label=f];
n38->n40  [label=t];
n4->n5  [label=l];
n4->n6  [label=u];
n4->n54  [label=y];
n43->n44  [label=f];
n43->n45  [label=t];
n54->n55  [label=g];
n54->n59  [label=p];
n54->n60  [label=s];
n55->n56  [label="<=204"];
n55->n57  [label=">204"];
n6->n7  [label=bb];
n6->n11  [label=dd];
n6->n12  [label=ff];
n6->n13  [label=h];
n6->n14  [label=j];
n6->n15  [label=n];
n6->n16  [label=o];
n6->n17  [label=v];
n6->n52  [label=z];
n63->n64  [label="<=4"];
n63->n65  [label=">4"];
n65->n66  [label="<=5"];
n65->n67  [label=">5"];
n7->n8  [label="<=164"];
n7->n9  [label=">164"];
}

c – 在Boost :: Graph中读取read_graphviz(),传递给构造函数的更多相关文章

  1. 移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 在applicationWillEnterForeground触发时更改UIView

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. UILabel导致应用程序在添加到视图时崩溃(仅限Xcode 6和iOS 8)

    我已将我的项目转换为Xcode6,以便为iOS8构建.但是,特定的UILabel会导致应用程序在添加到视图层次结构时崩溃.这是我收到的唯一错误日志:我无法在项目中的任何位置找到contentInsetsFromFonts方法.此外,我甚至无法在网上任何地方找到它的参考,包括Apple的文档.我没有为这个UIViewController使用NIB,因此UI是在loadView方法中构建的:该应用程序

  4. iOS 7通知中心与标签一样

    您可以试试,也许在将模糊应用到标签之前为模糊添加一点白色.

  5. iOS safari输入插入颜色

    我在iPhone设备上有一个小的CSS问题.我的搜索输入为蓝色,当用户关注它时,插入符号几乎不可见:在所有桌面浏览器中,即使在桌面Safari上,它也具有正确的颜色(白色).知道如何修复此问题并更改iOS设备上的插入颜色吗?

  6. 如何计算iOS 7中的实际字体大小(不是边框)?

    编辑:链接的“重复”问题仅涉及计算文本矩形.我需要在标签缩放之后计算实际字体大小,而不是字符串大小.此方法现已弃用:如何在iOS7中计算UILabel的字体大小,以缩小文字大小以适应?

  7. ios – 为什么在presentmodalviewcontroller调用时,navigationItem.titleView会左对齐?

    我正在使用UILabel作为导航栏的titleView.它工作正常,除了当我呈现模态视图控制器时,titleView从导航栏的中心移动到最左边.我在3.0及以上测试过.这是相关代码:截图:知道为什么会这样吗?

  8. ios – 在XCode中的UI测试期间无法访问自定义视图

    我们必须执行一些时髦的动画,这是我们最好的布局).问题是我无法访问此视图以模拟其上的点击.我可以使用app.staticText[“输入名称…”]访问标签,但是如果我点击它.记录我点击标签的会话将产生app.staticText[“输入名称…”

  9. ios – UITableView以编程方式调用滑动操作

    我有一个UITableView,用户可以向左滑动以显示动作.这一切都按预期工作.当用户点击单元格的某个部分时,我想触发这个.如何以编程方式调用此幻灯片动作?

  10. ios – 在SpriteKit中创建按钮:Swift

    我想在SpriteKit或SKScene中创建一个按钮,将视图发送到另一个视图控制器.我尝试使用“performSeguewithidentifier”,但显然SKScene不支持此功能.如何使用SpriteKit创建一个将视图发送到另一个视图的按钮?这是我尝试用来执行此操作的代码.带有“HomeButton.prepareForSegueWithIdentifier()”的行只是一个例子.它实际

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部