Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::sort对依赖关系树进行排序_C++_Sorting_Graph Theory - Fatal编程技术网

C++ 使用std::sort对依赖关系树进行排序

C++ 使用std::sort对依赖关系树进行排序,c++,sorting,graph-theory,C++,Sorting,Graph Theory,我想按照插件之间的依赖关系对它们进行排序,这样我就可以线性加载它们,而不会产生任何冲突。契约排除依赖循环(导致未定义的行为) 想象一棵深度为2的二叉树,它的边指向叶子。让这是一个人工依赖树。边集表示关系R。如果元组(lhs,rhs)在R中,则Compare返回true 我可以使用std::sort和一个表示rhs依赖于lhs的关系的比较来实现这一点吗?我最近也有同样的要求。我在用代码对数据库实体建模,需要一种映射依赖关系的方法,以便能够以正确的顺序创建和销毁实体 我用boost::graph库找

我想按照插件之间的依赖关系对它们进行排序,这样我就可以线性加载它们,而不会产生任何冲突。契约排除依赖循环(导致未定义的行为)

想象一棵深度为2的二叉树,它的边指向叶子。让这是一个人工依赖树。边集表示关系R。如果元组(lhs,rhs)在R中,则Compare返回true


我可以使用std::sort和一个表示rhs依赖于lhs的关系的比较来实现这一点吗?

我最近也有同样的要求。我在用代码对数据库实体建模,需要一种映射依赖关系的方法,以便能够以正确的顺序创建和销毁实体

我用
boost::graph
库找到了一个解决方案。我已经包含了一段(真实代码),希望它能帮助您朝着正确的方向开始

在下面的代码中,函数
create\u order
按照实体必须创建的顺序生成实体向量,而
drop\u order
则相反(最依赖的实体排在第一位):

使用edge=std::pair;
使用edge_vector=std::vector;
使用graph_properties=boost::property<
boost::顶点颜色,
boost::默认颜色类型
>;
typedef boost::邻接列表图;
typedef boost::graph_traits::vertex_描述符顶点;
结构周期检测器:公共boost::dfs\u访问者
{
循环检测器(边向量和后边)
:_后_边(后_边)
{ }
void back_edge(常量boost::graph_traits::edge_descriptor&e,常量graph&)常量{
_后缘。后置(电磁源、电磁目标);
}
受保护的:
边向量和后边;
};
自动生成图()常量{
图g(std::begin(_边),std::end(_边),_entities.size());
返回g;
}
无效检查循环(常数图和g)常数
{
边\向量返回\边;
循环检测器vis(后边缘);
深度优先搜索(g,访问者(vis));
if(背面边缘.size())
{
std::ostringstream ss;

ss我最近也有同样的需求。我正在用代码对数据库实体建模,需要一种映射依赖关系的方法,以便能够以正确的顺序创建和销毁实体

我在
boost::graph
库中找到了一个解决方案。我包含了一段(真实代码),希望它能帮助您朝着正确的方向开始

在下面的代码中,函数
create\u order
按照实体必须创建的顺序生成实体向量,而
drop\u order
则相反(最依赖的实体排在第一位):

使用edge=std::pair;
使用edge_vector=std::vector;
使用graph_properties=boost::property<
boost::顶点颜色,
boost::默认颜色类型
>;
typedef boost::邻接列表图;
typedef boost::graph_traits::vertex_描述符顶点;
结构周期检测器:公共boost::dfs\u访问者
{
循环检测器(边向量和后边)
:_后_边(后_边)
{ }
void back_edge(常量boost::graph_traits::edge_descriptor&e,常量graph&)常量{
_后缘。后置(电磁源、电磁目标);
}
受保护的:
边向量和后边;
};
自动生成图()常量{
图g(std::begin(_边),std::end(_边),_entities.size());
返回g;
}
无效检查循环(常数图和g)常数
{
边\向量返回\边;
循环检测器vis(后边缘);
深度优先搜索(g,访问者(vis));
if(背面边缘.size())
{
std::ostringstream ss;
ss不,我不这么认为

想象一下:

  A
 / \
B   C
     \
      D
B和C依赖于A,D依赖于C。现在:

  • B不依赖于C,因此B不小于C
  • C不依赖于B,因此C不小于B
  • 因此,就排序算法而言,B“等于”C
  • 类似地,D“等于”B
  • 第一个问题:B=C,B=D,但是CNo-我不这么认为

    想象一下:

      A
     / \
    B   C
         \
          D
    
    B和C依赖于A,D依赖于C。现在:

  • B不依赖于C,因此B不小于C
  • C不依赖于B,因此C不小于B
  • 因此,就排序算法而言,B“等于”C
  • 类似地,D“等于”B

  • 第一个问题:B=C,B=D,但CNo,这是不可能的。假设A依赖于B,而B依赖于C。现在,你所谓的谓词如何比较A和C?听起来像是你在寻找的。同意@VittorioRomeo。看起来像是拓扑排序的经典应用,顶点是插件,边是它们之间的关系……看不,这就是这是不可能的。假设A依赖于B,B依赖于C。现在,你所谓的谓词如何比较A和C?听起来像是你在寻找的。同意@VittorioRomeo。看起来像是拓扑排序的经典应用,其中顶点是插件,边是它们之间的关系…参见