Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++;强化学习与智能指针_C++_Smart Pointers_Reinforcement Learning - Fatal编程技术网

C++ C++;强化学习与智能指针

C++ C++;强化学习与智能指针,c++,smart-pointers,reinforcement-learning,C++,Smart Pointers,Reinforcement Learning,我正在使用强化学习方法(Q、sarsa、TD(λ)、演员评论家、R等)进行机器人感觉运动在线学习的硕士项目。我目前正在设计一个框架,高级强化学习和低级机器人API控制都将在这个框架上使用 由于状态依赖于机器人传感器,并且可能(将)呈指数增长,因此我将在堆上分配它们。由于这会产生很多问题、bug等,而且并行化(即线程化)是强化学习的一个方面,我想探索一下,所以我还不确定使用哪种智能指针 为智能指针设计我自己的模板/类需要时间和调试,而我没有。所以,我想知道,我应该使用STL的auto_ptr?我发

我正在使用强化学习方法(Q、sarsa、TD(λ)、演员评论家、R等)进行机器人感觉运动在线学习的硕士项目。我目前正在设计一个框架,高级强化学习和低级机器人API控制都将在这个框架上使用

由于状态依赖于机器人传感器,并且可能(将)呈指数增长,因此我将在堆上分配它们。由于这会产生很多问题、bug等,而且并行化(即线程化)是强化学习的一个方面,我想探索一下,所以我还不确定使用哪种智能指针

为智能指针设计我自己的模板/类需要时间和调试,而我没有。所以,我想知道,我应该使用STL的
auto_ptr
?我发现它们在向量中使用时存在问题。我应该使用
boost::shared\u ptr
?这些状态必须在许多类和算法之间共享。或者我应该使用
boost::ptr_vector
?由于状态将驻留在向量中的任务容器类中,这就足够了吗?这些状态必须是共享的、可复制的、可引用的、可序列化的、非常量的、线程安全的,并且不会被删除。此外,内存空间和计算时间也很重要

对于此类任务,您推荐什么是最佳的smart ptr实施方案

谢谢大家!


似乎我必须尝试在类状态中使用boost::ptr_vector,如果这证明无效,那么使用std::vector并启用0X。
谢谢大家的回答和建议

单一所有权指针更难被滥用,它是std::auto_ptr设计的模块。可以考虑使用<代码> Boo::SimeDePPTR < /C>,这是安全的(它不能传递所有权,不能从函数返回)。对于容器,您可以使用指针容器,但如果所涉及的类型不是多态性使用的,也可以使用没有智能指针的
std::vector


共享所有权仍然是一种例外情况;不要过度使用
boost::shared_ptr

其他建议遗漏了一条
boost::intrusive_ptr
的性能优于
shared_ptr
,因为它不需要第二次分配来保存引用计数。<代码> BuffsiVIETPRT的下边是一个额外的簿记,没有使用<代码>弱pTR 的能力。

< P>我在C++中从未找到我喜欢的智能PTR类。最后我写了我自己的

它有一个高速缓存功能,所以你可以不断地分配和释放内存,它可以保留它拥有的内存并重用它。此外,它没有默认构造函数,因此您必须通过引用将其传递给函数/方法,否则编译器将显示错误,这样它就不会创建内存的临时副本,尤其是在处理大型图像文件时


编写自己的代码不会花费太长时间,您也可以在其中添加自己的边界检查代码。

谢谢您的回复。如果一个指针不能从函数返回,那么这就是一个问题。我不在乎转让所有权。这些类型将以多态方式使用,至少是其中的一些类型,因此使用std::vector是我的问题之一。@Alex
std::auto_ptr
仍然是一个选项
const std::auto_ptr
还可以防止意外的所有权转移。@Alex不要将
std::auto_ptr
用于标准容器。将Boost指针容器用于多态行为。
auto_ptr
是C++98在不支持语言的情况下实现传输语义的方法,这是一个惊人的技巧。因此,您不能在容器中使用它,在C++98中,容器要求元素类型遵守复制语义。在C++0x中,
unique_ptr
是执行
auto_ptr
尝试执行的操作的正确方法。@Alex不要使用
boost::ptr_向量
(或
boost::ptr_向量
);使用一个
boost::ptr_向量
。检查文档。(而且
boost::ptr_vector
被设计成与
std::auto_ptr
接口)我们说的有多小?@Alex:你可能想阅读它的boost文档,但你需要提供一个参考计数字段和函数来增加和减少它。是的,我刚刚阅读了文档。但是,我不明白为什么它比共享的\u ptr更好,共享的\u ptr似乎是我目前最好的选择。@Alex:共享的\u ptr引用存储在单独的内存块中,这会导致另一次间接指针查找和第二次缓存线跳出。如果您想自己查看引用计数,intrusive_ptr还可以让您直接了解引用计数。这只是另一个选项,不是特别重要。你的类是否有原子引用计数更新,以便可以在多线程环境中使用?我当时根本不需要编写多线程代码。然而,如果代码在关键部分之间使用,它应该可以工作?假设我沿着这条路走下去,除了析构函数、原子引用和锁之外,我还需要包括什么?看看
std::shared_ptr
是如何实现的:-)这是数量惊人的簿记代码
std::unique_ptr
应该简单得多,多亏了移动语义,它也非常有用。如果您决定编写自己的代码,则需要重写各种运算符以使其正常工作。可以使用关键部分或旋转锁的锁。将其作为模板编写以供将来使用也是一个好主意。然而,只有你可以决定你是否有时间等。我不这样做,但我会考虑使用它,我使用的是GCC 4.5,我知道它可以启用,但有一定的局限性。在这个问题上,0X的优势是什么?您可以使用
unique\u ptr
,它相当轻(比
shared\u ptr
轻)。因为它是可移动构造的,所以您可以