Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++开源计算机代数系统中要解决)。一般来说,假设需要堆叠的协同路由是正确的吗?在协同程序之外是否存在C++选项?< /P>_C++_Algorithm_Coroutine_Boost Coroutine - Fatal编程技术网

此匹配算法使用哪个协同程序库? 我想知道哪一个协同程序库适合实现以下算法,这是一个简化的符号表达式交换模式求解问题(在C++开源计算机代数系统中要解决)。一般来说,假设需要堆叠的协同路由是正确的吗?在协同程序之外是否存在C++选项?< /P>

此匹配算法使用哪个协同程序库? 我想知道哪一个协同程序库适合实现以下算法,这是一个简化的符号表达式交换模式求解问题(在C++开源计算机代数系统中要解决)。一般来说,假设需要堆叠的协同路由是正确的吗?在协同程序之外是否存在C++选项?< /P>,c++,algorithm,coroutine,boost-coroutine,C++,Algorithm,Coroutine,Boost Coroutine,给定两棵任意长度的树(或DAG),包含三种类型的节点,黑色/红色,具有任意数量的子节点;黑色节点的子节点顺序固定,而红色节点的子节点顺序则无关紧要;然后离开。查找两棵树是否匹配的算法变得非常复杂,因为红色节点的可交换性以及没有规范顺序,因此无法简单地对节点的所有子节点进行排序。例如: Source Pattern red1--->leaf1, leaf2 Red1--->Leaf1, Leaf2 |

给定两棵任意长度的树(或DAG),包含三种类型的节点,黑色/红色,具有任意数量的子节点;黑色节点的子节点顺序固定,而红色节点的子节点顺序则无关紧要;然后离开。查找两棵树是否匹配的算法变得非常复杂,因为红色节点的可交换性以及没有规范顺序,因此无法简单地对节点的所有子节点进行排序。例如:

Source                     Pattern

red1--->leaf1, leaf2       Red1--->Leaf1, Leaf2
|                          |
red2--->leaf1, leaf2       Red2--->Leaf2, Leaf1
使用类层次结构和虚拟成员函数
match()
的递归调用可以轻松实现标准(非交换)情况,该函数匹配节点本身,然后匹配每个子节点。这里发现
leaf1
Leaf2
不同,递归调用返回
False
。但是,如果红色是可交换的,则在红色节点上,算法1。需要遍历其节点的所有排列,以及2.,如果对红色
match()
的调用成功,则需要挂起排列循环,因为调用方可能失败,需要不同的匹配。仅将状态存储在调用方中是不够的,因为被调用方本身可能调用了
match()
,并且需要重新启动,否则可能会丢失一个解决方案


在函数式语言中,递归调用中的yield就可以做到这一点。例如,matchpy包有一个Python实现。这似乎是一项协同程序任务,但您会使用哪个库?
boost::corroutine
是唯一适合这种情况的吗?C++20会给我们带来这个功能吗?clang已经可以做到这一点了吗?

为什么需要协同程序?为什么不只是一个保存当前状态的函子,然后返回python中的
yield
?我没有尝试。函子是否总是可以用coutroutines替换实现?@rwst您可以用有状态函数对象来实现协程(C++术语使用“函子”,而不是类别理论),如此空虚yes@rwst我可能遗漏了一些东西,但就我而言,函子和协同程序对于更简洁、更具表现力的代码(尤其是在单线程的情况下)来说大多是语法上的糖分。但最终它们都可以用C语言中的上下文结构的函数来模拟。这并不是说它们没用,它们可以为您节省大量样板代码。Iirc最近的Visual Studio提供了实验性的coro支持作为语言扩展