转使用BoostGraphlibrary(一)emyyu

本文翻译自"ManipulatingC++GraphDataStructureswiththeBoostGraphLibrary",原文请见:

使用Boost创建一个简单的图

一般地,在计算机中图可以表示为一组顶点和一组连接顶点的边的集合;边简单地表示为顶点对。进一步每一个顶点和每一条边可能还依附着额外的数据,比如对边来说会有一个数来表示权重。这就是Boost库如何工作的本质。

BoostGraphlibrary是以模板的形式提供的,这意味着你可以在这些模板的基础上创建自己的类型。然而,这些模板的所有类型参数都有默认值,所以你无需任何定制,就可以创建一个图。

下面的一小段代码展示了创建一个图和插入顶点和边的过程,这段代码可以被完全编译,但它除了创建一个图外,并没有做其他什么事情。

#include

#include

#include

usingnamespaceboost;

intmain(intargc,char*argv[])

{

adjacency_list<>mygraph;

add_edge(1,2,mygraph);

add_edge(1,3,mygraph);

add_edge(1,4,mygraph);

add_edge(2,4,mygraph);

return0;

}

mygraph变量就是一个图,其类型是adjacency_list,它是图库中基本的图模板类型。在这里我们使用了默认参数,在<>中的参数列表是空的。

函数add_edge是一个模板协助函数,它用来给图增加顶点或边的。为了使用它,你需要传递两个顶点参数,如果在该图中这些顶点不存在,则它们会被加入;然后连接这两个顶点的边也会被加入。这样,上面的这段代码就创建了一个图,它具有四个顶点,编号是1,2,3,4,边有(1,2)、(1,3)、(1,4)、(2,4)。

这只是一个很基本的例子。为了创建更加复杂的图,你需要定义更多的数据关联到你的边和顶点,我们将在下一节讨论。

给顶点和边增加属性值

当你使用图,通常你会附加一些信息给顶点和边,图库使用了一个很有趣的方法来做到这一点。诸如名字或颜色信息作为一种属性来存储,一个属性由一个名字(或标识),如距离,和类型,如浮点数或字符串,组成。你可以给顶点和边增加属性。

提示

在图库中,有几个常用的,已经内建好了的属性标识,如颜色,名字和权重。所有的内建标识都列在在线帮助中,同样你可以在graph/properties.hpp这个头文件中找到它们。它们是用宏的方式来定义的,形成了枚举常量。比如,在properties.hpp中有一行属性定义:

BOOST_DEF_PROPERTY(edge,name);

这个宏的结果是产生了一个枚举常量edge_name,它的类型是edge_name_t。你还能看到其他的内建属性标识定义。

typedefpropertyEdgeWeightProperty;

typedefpropertyVertexNameProperty;

第一行定义了EdgeWeightProperty类型,模板的第一个参数是这个属性的标识,在这里我们使用的是预先定义好的标识edge_weight_t,它的意思是边的权重,第二个参数是int,意思是这个属性具有一个整型数值。第二行定义了第二个属性,它的标识是vertex_name_t,类型是string。

现在你已经定义好属性,你可以定义一个图类型了:

typedefadjacency_list

VertexNameProperty,EdgeWeightProperty>Graph;

这个定义中的前三个模板参数是预先定义好的,第一和第二个参数(都是vecS)表示我们要求图使用vector来作为图的内部存储方式,第三个参数说明这是一个无向图,第四、五个参数是我们刚刚定义的属性类型,前者是顶点的属性类型,后者是边的属性类型。

这个时候,你可能会有疑问:如何给顶点和边指定不止一个属性类型呢?事实上,可以把属性串联在一起。基本类型模板包含了一个模板参数,它可以是你已经定义的属性类型。下面是顶点类型定义,不过,这时我们定义了为顶点定义了两个属性,一个是name,一个是index(下面的代码使用了预定义的标识vertex_index2_t):

typedefproperty

VertexIndexProperty;

typedefproperty

VertexIndexProperty>VertexNameProperty;

注意:

这里使用的是vertex_index2_t,而不是vertex_index_t,这是因为后者有一些与它有关的内建模板已经做了我们正在做的。

我们首先定义了index属性,不过这个顺序无关紧要。属性VertexNameProperty就包含了VertexIndexProperty作为它的第三个参数,这样就创建了一个链。然后你也可以象前面一样将VertexNameProperty作为第四个参数传递给图定义。

你也可以精简你的代码,不过精简过的代码对于图库初学者来说可读性要差一些,虽然一旦你理解了属性的这种机制后,这种精简的过程也是十分的直接。

property>VertexProperties;

我们重命名了类型VertexProperties,这是由于它现在包含了两种不同的属性。有个地方请大家注意,C++标准要求在两个>之间要有空格,这是为了同>>运算符区分开来。别忘了这个空格,否则你将得到编译错误。

操纵属性

property_map::type

city_name=get(vertex_name,g);

property_map::type

city_index2=get(vertex_index2,g);

property_map::type

edge_distance=get(edge_weight,g);

别担心这里的函数名字是一个很通用的单词get,这个函数是得到很好定义的模板函数,它会编译的很好。

请记住,这里的三个调用你可以用来获得顶点的属性和边的属性,虽然我们这里给出的代码片段是针对顶点来做的。下面的一行代码将来要用于获得属性:

std::cout<

这里的vp.first是一个指向vertex的指针。对象city_name象map一样地工作,它将一个顶点对象作为参数,然后返回该顶点合适的属性,在这个例子中,返回的是城市名。

加入顶点和边

在你指定了属性类型和定义了图类型之后,你已经可以去创建一个图实例,然后向图结构中加入顶点和边,这些顶点和边是具有你所定义的属性的。

THE END
1.有效文献查找与管理的步骤与技巧指南学术文章论文引用文献:在综述中准确引用所使用的文献,确保遵循相关的引用格式(如APA、MLA等)。 八、保持文献更新(Keep Literature Updated) 学术研究是一个动态的过程,新的文献和研究不断涌现。因此,保持文献的更新是非常重要的。可以通过以下方式保持更新: 设置文献提醒:在相关数据库中设置文献提醒,以便及时获取该领域的最新研究https://www.163.com/dy/article/JJHEKJKS0556A727.html
2.Zilibrary资源轻松获取指南,详细下载指南助你轻松找到所需资源本文旨在为广大热爱阅读的朋友们提供关于如何使用Zilibrary这一电子书籍平台的详细指南,从了解平台的基本信息开始,逐步介绍如何下载书籍的详细步骤,包括可能遇到的问题及解决方法,提高下载效率的建议以及使用平台的小技巧,提及慈云数据等先进技术在助力用户获取和享受数字资源方面所发挥的重要作用。 https://www.zovps.com/article/index.php/post/412333.html
3.libraryResource使用libraryloaderlazihuman的技术博客libraryResource使用 library loader 我们在绘制原理图和PCB过程中,原理图符号和PCB封装的绘制、3D模型的查找和绘制需要占用大量时间。 贸泽网站提供了一款元器件库工具——Altium Library Loader,它依靠贸泽背后强大的数据库和器件库,可以将多种元器件的原理图符号、PCB封装、3D模型直接导入Altium Designer软件中,不仅节省https://blog.51cto.com/u_12947/10772907
4.如何在zilibrary上下载电子书到静读天下【创新维】_触控一体机哪个品牌好 【创新维】_无线触摸一体机 【创新维】_85寸触摸一体机厂家 【创新维】_触控一体机42寸 【创新维】_山东42寸触摸一体机 【创新维】_佛山触摸一体机 【创新维】_触摸一体机厂商 【创新维】_天津触控一体机 【创新维】_纳米电容屏黑板 https://xbeibeix.com/video/BV1BN4y1K7Za
5.CNKI使用教程第十六讲格式精灵:一键排版省时省力上一讲,我们一起学习了学术不端检测工具的功能及使用,本期就为大家介绍下论文排版工具——格式精灵,帮助大家缩短成稿时间,提高写作效率~ 已关注关注重播分享赞关闭观看更多更多退出全屏视频加载失败,请刷新页面再试刷新视频详情 》〉扫码关注答题有奖〈《 https://mp.weixin.qq.com/s?__biz=MzUzMzUyNTg1NQ==&mid=2247500480&idx=1&sn=f9417bb3c148d8d52d4a660bd1e1381d&chksm=fb04bbd9b0c159d9f015fa61599f2bf3d1ae040153ed94aa631318f5923a05ba4be79ef4d32b&scene=27
6.文献综述学术论文阅读的10个高效工具。阅读文献是学术研究和文献综述的重要一步,如何高效阅读学术论文是学术研究者经常遇到的难题。本篇公众号文章将介绍10款阅读学术论文的高效工具。 第一个是R Discovery, R Discovery是一款免费的应用程序,供研究者查找和阅读研究论文。研究者可以使用该工具文献搜索和阅读感兴趣的学术论文,可以访问学术文章、科学期刊、https://zhuanlan.zhihu.com/p/13649414493
7.Zilibrary可用入口检索知识文献检索小木虫论坛求助:免费英文专业图书Zilibrary可用入口?https://muchong.com/t-16286086-1-pid-1
8.zliabary图书馆登录入口zliabary图书馆入口地址Zlibrary网址入口:>>点击进入<< 备用网址:>>点击进入<< 一、使用步骤 1、首先点开上方链接,如若遇到打不开的情况可能是路线不稳定,那么切换为下方备用网址即可。 2、需要登录账号,没有账号的小伙伴注册一个就行。 3、上边有着zliabary语言设置教程,先把zliabary设定变成中文,随后登陆zliabary。 https://app.ali213.net/gl/1280717.html
9.课堂秀创新设计学院第二季国际联合设计教学工作坊即将启动3.使用Raspberry Pi和或Ardunio进行数字/模拟输入和输出 4.了解Python、Javascript和NodeJS的核心用法 5.使用Python和NodeJS创建web服务器 6.了解网络系统的要素 7.在Processing library p5js中实现实时数据可视化 8.了解艺术设计的原型(prototype)的重要性 https://www.thepaper.cn/newsdetail_forward_7761577
10.自然博物馆用英语如何表达英语作为世界上较广泛使用的语言之一,学好英语对我们未来的工作和生活都有很大的帮助。为了帮助大家更好的学习,下文中是如何表达博物馆的英语信息,一起来看看吧。 博物馆的英语是museum,读音为英[mju"zim],美[mju"zim]。 museum解析如下: https://www.yswxk.com/qa-detail/ce2fb7a9d72211eea8fdfa163e176f5c
11.scikitlearn:machinelearninginPython—scikitExamples Dimensionality reduction Reducing the number of random variables to consider. Applications:Visualization, increased efficiency. Algorithms:PCA,feature selection,non-negative matrix factorization, andmore Examples Model selection Comparing, validating and choosing parameters and models. http://scikit-learn.org/
12.3年级下册语文听课记录13篇(全文)1、打开书和安静一起触摸春天,注意读准字音,读通课文,看看盲童安静如何走进春天的?她触摸到了什么? 2、出示词语,正音,理解“磕磕绊绊”,范写“瞬”字。生试写,感受盲童的生活不易。 流畅 穿梭 悄然 拢住 奇迹 磕磕绊绊 多姿多彩 扑腾 曲线 缤纷 弧线 瞬间 清香袅袅 花繁叶茂 https://www.99xueshu.com/w/file68vyvm6c.html
13.系统分享教你如何注册ZZ-Library是一个提供免费电子书和学术论文的大型数字图书馆,始于2009年,拥有超过50万本书和4000万篇期刊论文。用户可以免费注册并下载资源,注册后享受更多功能。文章提供了详细的注册和使用教程,以及Z-Library的特色和历史背景。 摘要由CSDN通过智能技术生成 https://blog.csdn.net/qq_22903531/article/details/131373013
14.Zlibrary国内镜像网站入口链接有哪些Zlibrary使用教程 第一步:将上方的链接地址放入浏览器中或者是点击【zliabary网页版】,之后就会跳转新的界面; 第二步:玩家注册完成账号之后就可以顺利的登录了,或者是登录已有的账号; zliabary怎么设置中文 第一步:顺利登录网址之后,选择【Connect】,目前语言是英文; https://m.vqs.com/article/20014.html
15.PSoCCreator教程:如何在工程中创建LibraryProjectPSoCCreator会支持PSoC4000T 吗? 在同一 SDK/IDE 中使用预先加载的示例和主板支持包来完全支持所有PSoC4000 器件会很有帮助。 如果 发表于01-31 06:21 如何在CANPSOC6的PSoCCreator顶级设计中实现移位寄存器? 如何CANPSOC6的PSoCCreator顶级设计中实现移位寄存器? 目标设备是 CY8C6347BZI-BLD43 https://www.elecfans.com/d/1237154.html
16.如何使用集合初始值设定项初始化字典如何在查询中返回元素属性的子集 接口 委托 字符串 索引器 事件 泛型 其他C# 文档 使用英语阅读 保存 添加到集合 添加到计划 通过 Facebookx.com 共享LinkedIn电子邮件 打印 项目 2024/03/25 13 个参与者 反馈 本文内容 示例 另请参阅 Dictionary<TKey,TValue>包含键/值对集合。 其Add方法采用两个参数,一个https://msdn.microsoft.com/zh-cn/library/bb531208
17.php中的反射详细讲述php教程PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。 TP框架中反射的使用 1、ReflectionClass::__construct — 构造一个 ReflectionClass 类 public ReflectionClass::__construct ( mixed $argument ) https://www.php.cn/php-weizijiaocheng-388404.html
18.小学英语课程表magazine / ,m?g?'zi:n / 杂志 newspaper / 'nju:z,peip? / 报纸 dictionary / 'dikneri / 词典 2.身体部位(body) foot / fut / 脚 head / hed / 头 face / feis / 脸 hair / h / 头发 nose / n?uz / 鼻子 https://www.meipian.cn/297omv2p
19.MacOS安装XCode及使用bluedrum它可以安装Xcode 3.1.4+iphone sdk 3.1.2的版本。很不幸,苹果的官网只有最新的XCode 3.2.2+iphone SDK 4下载了。如果你想做iphone开发,只能好去找其它办法下载这个版本,或者去使用Mac OS 10.6.x来开发。 二.升级Mac OS 10.5.5到10.5.7 在折腾几天后,我确定先用 Mac OS 10.5.5来安装Xcode 3.1.4. http://blog.chinaunix.net/uid-20587912-id-405204.html