所以我目前正在测试我的计划。这就是我目前正在做的事情。基本上我创建了一个可以无限扩展的结构数组。现在我的问题是我希望它的一个向量指向一个已经是整个连接的一部分的位置。
(这实际上是神经网络的实验)
现在在下图中,这就是我将如何使用它。 vector(struct)中的一个项目将指向另一个已经是base的一部分而不仅仅是push和push的结构。
#include<iostream>
#include<vector>
using namespace std;
//structure for each neurons
struct Test{
char label[100];
vector<Test> conn;
};
void main(){
vector<Test> base;
base.push_back(Test());
base[0].conn.push_back(Test());
strcpy(base[0].conn[0].label,"Test");
//test on pointer
Test test;
strcpy(test.label,"Test 2");
base[0].conn.push_back(test);
strcpy(test.label,"Test 3");
base[0].conn.push_back(test);
//push_back here base[0].conn[0]
//which contains "Test" text
//so that conn[0] and conn[3] points at the same thing
cout<<base[0].conn[0].label<<"\n";
cout<<base[0].conn[1].label<<"\n";
cout<<base[0].conn[2].label<<"\n";
}
** 额外:我怎样才能让树的最深部分保存在一个变量(它的指针?)中,这样我就可以像deepest_part.label =&#34;&#34;而不是base.conn [0] .conn 1。conn [2]等等?
答案 0 :(得分:0)
这种类型的数据结构称为图形。这应该足以让您找到现有的图形库(例如Boost Graph Library),或者有关实现自己的图形库的信息。
图表可以有几种类型,你的是有向图,但允许循环。有向无环图(DAG)是常见的,有用的,经常讨论,但不适合你。
为了允许循环,您不能在尝试时将节点直接存储在父节点中 - 创建循环的子节点必须包含其父节点作为子节点,这显然会中断。如果使用此方案,则需要存储指向节点的指针。问题是你不能轻易使用智能指针:shared_ptr
将无法解除分配周期,而weak_ptr
仅在你有一些启发式方法来决定链接何时应该是强大的时候才有用变弱了。
更简单的解决方案,以及上面链接的BGL使用的解决方案是邻接列表。基本上所有节点都存储在一个表中(并且可能由表所有),conn
向量只存储连接节点的索引。
至于树的最深部分,假设你有办法告诉它是什么(你必须访问每个节点,用你发现到达它的最短路径的长度标记每个节点,检测周期,并有一些方法来解决关系等),你可以只存储索引。但是,对图形的任何更改都可能会更改值(例如,通过添加或删除某个子图的快捷方式),因此您需要始终重新计算它。