gpt4 book ai didi

c++ - 使用 Boost Graph Library 将 boost 动态属性写入文件

转载 作者:太空狗 更新时间:2023-10-29 20:56:09 25 4
gpt4 key购买 nike

我已经问了一个问题here关于使用 Boost Graph Library 并将图形写入文件。由于我的要求发生变化,我需要将动态图形属性写入 DOT 文件。经过一番查找,我设法想出了一些代码,但它不起作用。以下是我到目前为止所做的:

Map 类使用 Cell 类作为顶点,Cell 类使用单独的 CellProperty 类来设置和获取所有 Cell 属性。

最后是 Map 类,我在其中构建图形并尝试将图形写入 DOT 文件。

map .h

class Map {
public:
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, Cell> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;

explicit Map(std::string pGraphFilePath);
virtual ~Map();
void LoadGraph();
private:
Graph mGraph;
std::vector<std::vector<Vertex>> mGrid;
};

map .cpp

const unsigned int RowNum = 3;
const unsigned int ColumnNum = 4;

Map::Map(std::string pGraphFilePath) : mGraph(), mGrid() {}
Map::~Map() {}

void Map::LoadGraph() {
int dummyID = 1;
for (unsigned int row = 0; row < RowNum; row++) {
mGrid.resize(RowNum);
for (unsigned int col = 0; col < ColumnNum; col++) {
mGrid[row].resize(ColumnNum);

Vertex vID = boost::add_vertex(mGraph);
mGraph[vID].SetProperty<unsigned int>("ID", dummyID);
mGraph[vID].SetProperty<bool>("Navigable", true);
mGrid[row][col] = vID;
dummyID++;
// add the edges for the contained cells in the grid
if (col > 0) { boost::add_edge(mGrid[row][col - 1], mGrid[row][col], mGraph); }
if (row > 0) { boost::add_edge(mGrid[row - 1][col], mGrid[row][col], mGraph); }
}
}

// write cell properties
boost::dynamic_properties propertiesOutPut;

propertiesOutPut.property("ID", boost::get(boost::vertex_index, mGraph));

// As Navigable is an external property, it need to be mapped with the internal graph property
// the lines below are the update after I got the answers and link for my query
// cell.GetProperty() is a templated method the takes a default parameter, thus passing "false" bool parameter which returns the "Navigable" cell property
auto valueNavigable = boost::make_transform_value_property_map([](Cell &cell) { return cell.GetProperty<bool>("Navigable", false); }, boost::get(boost::vertex_bundle, mGraph));
propertiesOutPut.property("Navigable", valueNavigable);

std::ofstream fout("MyGraph.dot");
boost::write_graphviz_dp(fout, mGraph, propertiesOutPut, std::string("ID"));
}

我遇到的问题是 boost::get() 的 propertiesOutPut.property() 方法。我无法找出 boost::get() 的正确参数。请帮帮我。谢谢!!

最佳答案

您可以在包含顶点属性结构的属性映射之上使用 transform_value_property_map。 (你没有展示它)。

我有很多答案展示了如何做到这一点,虽然这些都是使用内部属性,但没有太大区别,因为 anu property map 可以用相同的方式转换,无论 property map 是内部的还是外部的(这就是属性映射的全部目的:解耦访问属性的方式)。

最相关:

其他:

关于c++ - 使用 Boost Graph Library 将 boost 动态属性写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34292539/

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