C++ 系统中表示路径的数据结构建议

C++ 系统中表示路径的数据结构建议,c++,boost,data-structures,stdvector,boost-graph,C++,Boost,Data Structures,Stdvector,Boost Graph,我有一个系统,我需要表示一些类似于路径的东西,路径只提供一条到达特定节点的路径。可以使用多条路径到达同一节点 我目前使用节点向量表示路径,我需要执行诸如replaceSubpath、containsNode、containsSubPath、appendNode、getRootNode、getLeafNode之类的操作(非常类似于对字符串执行的操作)。所有这些操作都可以在vector上完成,但大路径的性能可能会很差 我正在考虑使用boost::graph,但没有使用它的经验,我想知道对于这些和类似

我有一个系统,我需要表示一些类似于路径的东西,路径只提供一条到达特定节点的路径。可以使用多条路径到达同一节点

我目前使用节点向量表示路径,我需要执行诸如replaceSubpath、containsNode、containsSubPath、appendNode、getRootNode、getLeafNode之类的操作(非常类似于对字符串执行的操作)。所有这些操作都可以在vector上完成,但大路径的性能可能会很差

我正在考虑使用boost::graph,但没有使用它的经验,我想知道对于这些和类似的操作,使用boost::graph是否是正确/良好的数据结构


任何关于使用其他数据结构的建议也会有帮助,我知道我可以通过保持节点到迭代器的(多)映射等来优化向量解决方案。

本质上,Boost的类
邻接列表
。图是顶点向量。顶点描述符是该向量中的整数索引

通常,树或路径(路径是树的一个特例,对吗?)表示为前置映射(如从叶子向后到根或从目标向后到源)。对于整数顶点描述符,这样的前置映射只是
向量
。我不认为你可以用更紧凑的方式来表示一条路径或一棵树


当然,这些前辈的向量可以被替换成字符串操作,特别是Boost.string_Algo中的操作,

根据您的描述,听起来像是在图形中生成和编辑路径,可能是为了优化路由等

我不认为一个数据结构就能满足您的需求。我会将图形结构与生成的路径分开

replaceSubpath:对我来说,这将建议一个实现。当您有了路径的开始和结束时,只需粘贴它并替换子路径

强>包容节点< /强>:考虑添加一个映射或快速安全检查的集合。

containsSubPath:这可能很困难,具体取决于您的其他顾虑和速度需求。如果这是一个非常重要的操作,那么快速地考虑一个测试子路径。请记住,如果路径没有太大变化,那就更好了,因为构建它们是O(N)

附录节点:链接列表在这里很简单

getRootNode:保持指向当前根节点的指针

getLeafNode:按住指向当前叶节点的指针


我将创建一个自定义数据结构,它可以根据您的目标解决这些问题。找到子路径并快速替换它们可能是相互竞争的性能目标。通常更多的搜索优化=更多的构造开销,使它们更不动态。

看看您欣赏的其他一些代码是如何实现管理路径的需要的。例如,您可能会查看Dijkstra的几个实现,并选择一个看起来最好、最方便或最符合您口味的实现

依我看,将“路径”建模为对象不是一个好主意,而是将其视为图形中节点的属性


一般来说,我会考虑路径上的“标记”节点。例如,用于包含节点属性的类可能有一个标志,指示该节点是否在路径上,以及一个带有路径上下一个节点索引的属性。

boost::graph
,使用boost graph替换子路径??您不想将其表示为单个字符串的原因是?或者,您知道,
boost::path
?@MooingDuck我没有听说过boost::path。可以链接到它。我找到的唯一路径是boost::filesytem::path,我认为它不适合这里。请您给我指出一些例子,其中这些字符串算法用于邻接列表??例如,您从生成前置映射的一些图形算法开始,例如Dijkstra最短路径()或Kruskal MST。然后,通常使用此前置映射构建感兴趣的路径。该路径基本上与前置贴图的形式相同,但没有不相关的顶点。我假设你也有一个潜在的子路径sp,它的形式与前面的映射一样(作为向量编写),最后,你使用boost::algorithm::find_first(sp,path)来回答像containssubpath这样的问题。那么为什么我需要使用邻接_列表呢?我不能只保留向量并使用boost string algolibrary对其应用各种字符串操作吗。目前我构造路径的方法是使用vector.push_back(node)。我认为@MichaelSimbirsky在实现上给出了一些很好的建议。如何使用这些路径/子路径?当您“replaceSubPath”时,是否需要修改原始图形?我需要知道更多。我明白你关于标记路径的意思。这将如何满足OP查找和替换子路径的需求?此外,如果需要多条路径,则向顶点属性添加标志不会缩放。也许我错过了什么。