问题标签 [intrusive-containers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为 Boost shared_ptr 拥有自己的 AddRef 和 Release
我曾经听说可以将Boost
shared_ptr
orintrusive_ptr
引用 add 和 release 函数映射到我自己的 add 和 release 引用函数的实现。
这真的可能吗?如果是,任何人都可以向我指出有关此功能的一些资源吗?
谢谢!
c++ - 为什么没有 boost::intrusive::map?
boost 文档 ( http://www.boost.org/doc/libs/1_55_0/doc/html/intrusive.html ) 声明侵入式容器是针对list
(单/双链接)实现的,set
并且multiset
. 我找不到地图的实现。有没有更深层次的原因,还是只是等待实施?
c++ - shared_ptr 的性能列表
我有:
- X 级
- boost::unordered_map 的 X
X 列表 - 用于根据时间戳使元素超时
我需要从列表中插入和删除具有性能的元素。我虽然使用了侵入式列表,所以一个元素可以将自己从列表中删除,而无需遍历所有列表。
- 我想用 shared_ptr 包装 X,这样它就不会泄漏......
我发现 shared_ptr 与 intruive ptr 不兼容。
1.你还有什么提议吗?
使用带有 2 个索引(散列和有序)的 shared_ptr 的 multi_index 可能是最好的解决方案,但我不能使用它。
2.多索引中的有序索引对删除元素有效吗?
c++ - 我可以使用提升池作为存储来支持提升侵入式集合吗?
我知道 boost 侵入式集合最终会存储对对象的引用,因此对象需要自己的生命周期管理。
我想知道我是否可以简单地使用提升池来管理那个生命周期。当我想在 boost 侵入列表中存储一个新对象时,我可以从 boost 池中分配一个对象并将其存储在列表中吗?然后,当我从列表中删除时,我使用提升池解除分配。
c++ - 尝试学习 boost::intrusive Q2
如果我取消注释这些
在循环之外并注释掉循环内它崩溃的那些。我需要能够在任何循环之外拥有基本列表(和成员列表)。这是如何实现的?
编辑
我试图以最简单的形式解决的实际问题是这个。
我想要一个 std::vector
MyClass
,称之为 AllThingsBunchedTogether。我还想要一个 std::vectorBaseList
,称之为 AllThingsSpreadOut。所以
- AllThingsBunchedTogether 可能包含(只是
anInt1
为了紧凑起见的部分)1,2,1,10,2,3,4,4,5,9,10,10
:。1,1
AllThingsSpreadOut 可能在 [1] at [2]2,2
at [3]3
at [4]4,4
at [5]5
at [9]9
at [10]包含(零目前未使用)10,10,10
。请注意,数字本身并不存储在 中
BaseList
,而是存储在例如MyClass
(1, "John") 中。在 [1] 它可能是“Mike”、“John”,在 [2] 它可能是“Mike”、“Dagobart” 在 [3] “John” ... 在 [10] “John” “Mike” “ Dagobart”等,因此
BaseList
在 AllThingsSpreadOut[i]中的任何一个都没有重复项,因为每个散列MyClass
中的每个BaseList
散列到不同的值 (anInt1 + Name
)。本质上,
anInt1
告诉MyClass
AllThingsSpreadOut 中的生活位置,但anInt1 + name
保证每个BaseList
.所以这个想法是 AllThingsSpreadOut 是一个向量,
BaseList
其中每个BaseList
向量位置都是相似事物的列表。然后,当我从 AllThingsBunchedTogether 中删除内容时(不是通过清除,而是通过搜索删除某些项目,如 IsMarkedToDelete 下面的代码),它们将自动从相应的 AllThingsSpreadOut 中消失。
AllThingsSpreadOut 充当 AllThingsBunchedTogether 的一种,具有侵入性语义。AllThingsBunchedTogether 允许通过 [] 进行超快速访问。
结束编辑
c++ - 尝试学习 boost::intrusive Q3 - 在 IC 中存储指针时,我应该使用 smart_pointer 吗?
我对侵入式容器的理解有了很大的进步。我有一个运行“一段时间”的程序,然后在这样的代码行上删除 *it; (见下文):
程序因此堆栈跟踪而崩溃:
这是一个奇怪的错误,因为该程序不是多线程的,但它可以顺利运行一段时间。我不确定发生了什么,但也许我需要使用 smart_pointers?
c++ - Assigning a new value to a iterator of a intrusive container
While working boost intrusive container splay_set, i have to reset local iterator member variables. Please see sample code below -
Intrusive container doesn't support assignment i suppose. I also cannot initialize splay_set
iterator via member initializer list. There is so limited example on boost and other site. None gives clear answer to this question.
My question is what should i do to assign a new value to a splay_set iterator (and in general sense to a intrusive container.)
c++ - 如何将 slist 'node_ptr' 转换为我自己的节点类型
我已经声明了以下node
继承自boost::intrusive::slist_base_hook<>
:
包含这些节点的列表的声明:
我想从成员函数中获取根节点InputBufferSglList
,所以我尝试这样做:
InputBufferSglNode* node = this->get_root_node();
但出现错误:
我应该投到node_ptr
吗InputBufferSglNode*
?应该是哪个铸件?
c++ - 如何使用 Boost Intrusive 克隆钩子?
我正在学习 Boost Intrusive 库。当我尝试复制 STL 容器时遇到问题。我使用 std::vector。它包含list_base_hook
模式中的类元素,auto_unlink
但是当您调用复制构造函数时,有关节点(is_linked()
)的信息会丢失。
我有以下代码:
标准输出:
为什么向量copy_nodes
没有链接?
谢谢。
c++ - Boost::IntrusiveList 与共享指针
所以我正在使用 FastDelegate<> 和 boost 库编写一个事件处理系统。我需要为监听器设置一个指向事件数据的共享指针队列以及一个 FastDelegate> 列表。所以这就是问题所在。
侵入式列表和队列不允许 shared_ptr 甚至常量引用,这使我的代码导致编译时错误。无论如何,我可以做到这一点?
将共享 ptr 交给代表似乎是最安全的,这样事件就会一直存在,直到每个人都真正完成它。