如何使用boost make_label_writer写入边缘属性?

2023-12-14

我有一个简单的图,我成功地用顶点编写了属性,但是当我使用make_label_writer将属性写入边缘时,编译器总是会抱怨。有人可以帮忙吗?

我的代码如下:

int main (int argc, char * argv[]) {
    typedef std::pair<int ,int> Edge;
    std::vector<Edge> used_by = {Edge(1, 0), Edge(2, 1),
            Edge(1,2), Edge(2, 0)};
    using namespace boost;
    typedef adjacency_list<vecS, vecS, directedS
             > Graph;
    Graph g(used_by.begin(), used_by.end(), 3);
    std::ofstream dmp;
    dmp.open("dmp.dot");
    //name for vertex
    std::vector<std::string> name{"one", "two", "three"};
    //name for edge
    std::vector<std::string> name1{"e1", "e2", "e3", "e4"};
    write_graphviz(std::cout, g, make_label_writer(&name[0]) 
                                   ,make_label_writer(&name1[0]));
}

The write_graphviz()将 ofc 称为模板,这完全没问题:

  template <typename Graph, typename VertexWriter, typename 
  EdgeWriter>
  inline void
  write_graphviz(std::ostream& out, const Graph& g,
             VertexWriter vw, EdgeWriter ew
       BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
  {
    default_writer gw;
    write_graphviz(out, g, vw, ew, gw);
  }

所以现在的问题是:当我只使用编写顶点属性时make_label_writer(&name[0]]]),代码完美运行。但是当我添加make_label_writer(&name1[0]),有错误。


默认顶点索引是整数,这就是为什么您可以使用第一个顶点名称的地址作为隐含关联属性映射。

边缘描述符是一个不同的野兽,要求您要么

  • 创建一个显式迭代器属性映射(使用额外的索引属性映射将边缘描述符映射到积分索引到name1 vector)
  • 或使用关联 PropertyMap 概念的模型。

在这种情况下,您应该使用属性来稍后执行std::map<edge_descriptor, std::string>.

还请考虑使用以下方法让您的房产生活变得更加简单捆绑属性.

关联属性图

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS> Graph;

int main() {
    Graph g(3);
    auto e1 = add_edge(1, 0, g).first;
    auto e2 = add_edge(2, 1, g).first;
    auto e3 = add_edge(1, 2, g).first;
    auto e4 = add_edge(2, 0, g).first;

    std::vector<std::string>                      vname{ "one", "two", "three" };
    std::map<Graph::edge_descriptor, std::string> ename{ 
        { e1, "e1" },
        { e2, "e2" },
        { e3, "e3" },
        { e4, "e4" },
    };

    write_graphviz(std::cout, g,
            boost::make_label_writer(&vname[0]),
            make_label_writer(boost::make_assoc_property_map(ename)));
}

Prints

改为捆绑属性

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>

struct VertexProps { std::string name; };
struct EdgeProps   { std::string name; };
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProps, EdgeProps> Graph;

int main() {
    Graph g(3);
    g[0].name = "one";
    g[1].name = "two";
    g[2].name = "three";
    add_edge(1, 0, {"e1"}, g);
    add_edge(2, 1, {"e2"}, g);
    add_edge(1, 2, {"e3"}, g);
    add_edge(2, 0, {"e4"}, g);

    write_graphviz(std::cout, g,
            make_label_writer(get(&VertexProps::name, g)),
            make_label_writer(get(&EdgeProps::name, g)));
}

打印出来是一样的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用boost make_label_writer写入边缘属性? 的相关文章

随机推荐

  • 我可以只用 CSS 创建这个形状吗?

    我正在为具有特定形状的网页构建一个英雄部分 目前我只是使用图像作为实际部分背景的叠加层 但我希望减少我发出的请求数量 并且会想知道是否可以使用 CSS 完成以下形状 所以黑色部分是实际图像所在的位置 而白色部分是我尝试使用 CSS 构建的部
  • C# 用阴影给图像着色

    我目前正在使用 C 创建一款游戏 并尝试为玩家创建服装 我想做布料设计并让玩家选择颜色 我从 TibiaME tibiame com 的游戏文件中拍摄了照片 它几乎满足了我的要求 我怎样才能用颜色填写这个表格 当我尝试替换某种颜色时 它不起
  • 无法将字符串分配给 Swift 函数内的数组元素

    下面代码中的两个赋值行都给出了这个错误 value T5 与 String 不同 func PrintShoppingList myList Array
  • SQL Server,检查 varchar 是否包含全零

    我需要编写一个函数来检查 varchar 变量值是否全为零 由于变量是 varchar 而不是 int 我有点迷失了 你会怎么办 多谢 您可以使用双重否定LIKE test variable NOT LIKE 0 这表示变量isn t由一定
  • 在同一个 goroutine 中创建的 goroutine 总是按顺序执行吗?

    package main func main c make chan int for i 0 i lt 100 i i i go func c lt i for b lt c println b if b 100 break 上面
  • 如何在 UIScrollView 中加载 UIViewController

    这是我的设置 我有一个UIScrollView在我的主视图控制器之上 我在其中加载多个视图控制器 我还有一个 添加 按钮 它将使用 Push segue 呈现一个新的视图控制器 我希望这个视图控制器也只加载在滚动视图的顶部 而不是整个屏幕
  • 组合器在哪里组合映射器输出 - 在映射阶段或映射减少作业中的减少阶段?

    我的印象是组合器就像作用于本地映射任务的减速器一样 即它聚合单个映射任务的结果以减少输出传输的网络带宽 并且从阅读中Hadoop The definitive guide 3rd edition 我的理解似乎是正确的 摘自第 2 章 第 3
  • Android:将应用程序添加到“将图片设置为”列表

    我正在尝试将我的应用程序添加到 设置为 列表 当我选择图像时 该列表会显示在图库中 如果用户在图库中打开图像 则会有一个按钮set as 当用户点击它时 他会得到一个列表 换句话说 如果他想在我的应用程序中使用该图像 我努力了
  • 重定向+403错误

    我正在寻找一种方法来拥有类似的东西 return HttpResponseForbiddenRedirect reverse view name 重定向到视图 及其名称 但仍然抛出 403 错误的 HttpResponse 我尝试做类似的事
  • 如何构造一个 URL 以使用 jquery lightbox 插件 colorbox 打开页面?

    我正在使用 jquery lightbox 插件 colorbox http colorpowered com colorbox 我希望能够构建一个像 www example com about me html 这样的 URL 它将用户发送
  • 配置php ini文件上传文件

    我有一个用于上传文件的页面 在 htaccess文件我有这个 php value upload max filesize 40M php value post max size 40M 我有一个 img 大小为 1 6 MB 当我尝试上传此
  • 静态单元格内的动态 UITableView

    我读过一些关于静态和动态单元不兼容的线程 但我想知道是否有一些适合我的情况的解决方法 我有一个静态表 由UITableViewController 我在其中一个单元格内放置了一个动态表格 委托和数据源是UITableViewControll
  • 如何在jQuery中解析XML跨域?

    从不同的服务器 域解析 XML 时 如何解决跨域问题 有人可以给我举个例子吗 该示例不必仅限于 jQuery 因为 JavaScript 也足够了 要充分理解为什么pure跨域 XML 不起作用 首先了解一下跨域 JSON 是如何促进的会有
  • Java 内存泄漏是否有可能使用比堆 + permgen 更多的内存? [复制]

    这个问题在这里已经有答案了 在任何情况下 Java 应用程序 例如 Tomcat servlet 应用程序 中的泄漏是否有可能超出分配的内存并使用额外的系统内存 或者为 JVM 分配的堆是否真正受到防火墙 可以这么说 其余的 操作系统 内核
  • JQuery 如何替换文本区域内的字符串?

    当前文本区域
  • 如何使用 Nuxt 设置 Flowbite? [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 这里有一个sandbox与 Nuxt 和 Flowbite 一起 根据 Flowbite 的说明导入 问题是flowbite组件的样式显示正确 但动态组件不起作用 可能是什么问题呢 也许这
  • C++ 检查文件是否存在

    我对 C 非常陌生 在我当前的项目中我已经包含了 include
  • REGEX - 必须包含字母数字和斜杠

    我正在尝试验证输入字段必须包含字母数字和斜杠作为其值 例如 AA AB 12314 2017 ASD 上面显示的是应作为输入字段的值的示例 我没有任何编写正则表达式的知识 所以请帮助我 最后我想出了下面的代码 var message mes
  • BaseX 属性无法序列化

    我有这个简单的 XML 文件
  • 如何使用boost make_label_writer写入边缘属性?

    我有一个简单的图 我成功地用顶点编写了属性 但是当我使用make label writer将属性写入边缘时 编译器总是会抱怨 有人可以帮忙吗 我的代码如下 int main int argc char argv typedef std pa