问题标签 [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.

0 投票
1 回答
418 浏览

c++ - 为 Boost shared_ptr 拥有自己的 AddRef 和 Release

我曾经听说可以将Boost shared_ptrorintrusive_ptr引用 add 和 release 函数映射到我自己的 add 和 release 引用函数的实现。

这真的可能吗?如果是,任何人都可以向我指出有关此功能的一些资源吗?

谢谢!

0 投票
2 回答
2124 浏览

c++ - 为什么没有 boost::intrusive::map?

boost 文档 ( http://www.boost.org/doc/libs/1_55_0/doc/html/intrusive.html ) 声明侵入式容器是针对list(单/双链接)实现的,set并且multiset. 我找不到地图的实现。有没有更深层次的原因,还是只是等待实施?

0 投票
0 回答
77 浏览

c++ - shared_ptr 的性能列表

我有:

  1. X 级
  2. boost::unordered_map 的 X
  3. X 列表 - 用于根据时间戳使元素超时

  4. 我需要从列表中插入和删除具有性能的元素。我虽然使用了侵入式列表,所以一个元素可以将自己从列表中删除,而无需遍历所有列表。

  5. 我想用 shared_ptr 包装 X,这样它就不会泄漏......

我发现 shared_ptr 与 intruive ptr 不兼容。
1.你还有什么提议吗?

使用带有 2 个索引(散列和有序)的 shared_ptr 的 multi_index 可能是最好的解决方案,但我不能使用它。

2.多索引中的有序索引对删除元素有效吗?

0 投票
1 回答
307 浏览

c++ - 我可以使用提升池作为存储来支持提升侵入式集合吗?

我知道 boost 侵入式集合最终会存储对对象的引用,因此对象需要自己的生命周期管理。

我想知道我是否可以简单地使用提升池来管理那个生命周期。当我想在 boost 侵入列表中存储一个新对象时,我可以从 boost 池中分配一个对象并将其存储在列表中吗?然后,当我从列表中删除时,我使用提升池解除分配。

0 投票
2 回答
543 浏览

c++ - 尝试学习 boost::intrusive Q2

如果我取消注释这些

在循环之外并注释掉循环内它崩溃的那些。我需要能够在任何循环之外拥有基本列表(和成员列表)。这是如何实现的?

编辑

我试图以最简单的形式解决的实际问题是这个。

我想要一个 std::vector MyClass,称之为 AllThingsBunchedTogether。我还想要一个 std::vector BaseList,称之为 AllThingsSpreadOut。

所以

  • AllThingsBunchedTogether 可能包含(只是anInt1为了紧凑起见的部分)1,2,1,10,2,3,4,4,5,9,10,10:。
  • 1,1AllThingsSpreadOut 可能在 [1] at [2] 2,2at [3] 3at [4] 4,4at [5] 5at [9] 9at [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告诉MyClassAllThingsSpreadOut 中的生活位置,但anInt1 + name保证每个BaseList.

所以这个想法是 AllThingsSpreadOut 是一个向量,BaseList其中每个BaseList向量位置都是相似事物的列表。

然后,当我从 AllThingsBunchedTogether 中删除内容时(不是通过清除,而是通过搜索删除某些项目,如 IsMarkedToDelete 下面的代码),它们将自动从相应的 AllThingsSpreadOut 中消失。

AllThingsSpreadOut 充当 AllThingsBunchedTogether 的一种,具有侵入性语义。AllThingsBunchedTogether 允许通过 [] 进行超快速访问。

结束编辑

0 投票
2 回答
131 浏览

c++ - 尝试学习 boost::intrusive Q3 - 在 IC 中存储指针时,我应该使用 smart_pointer 吗?

我对侵入式容器的理解有了很大的进步。我有一个运行“一段时间”的程序,然后在这样的代码行上删除 *it; (见下文):

程序因此堆栈跟踪而崩溃:

这是一个奇怪的错误,因为该程序不是多线程的,但它可以顺利运行一段时间。我不确定发生了什么,但也许我需要使用 smart_pointers?

0 投票
1 回答
243 浏览

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.)

0 投票
1 回答
81 浏览

c++ - 如何将 slist 'node_ptr' 转换为我自己的节点类型

我已经声明了以下node继承自boost::intrusive::slist_base_hook<>

包含这些节点的列表的声明:

我想从成员函数中获取根节点InputBufferSglList,所以我尝试这样做:
InputBufferSglNode* node = this->get_root_node();
但出现错误:

我应该投到node_ptrInputBufferSglNode*?应该是哪个铸件?

0 投票
1 回答
311 浏览

c++ - 如何使用 Boost Intrusive 克隆钩子?

我正在学习 Boost Intrusive 库。当我尝试复制 STL 容器时遇到问题。我使用 std::vector。它包含list_base_hook模式中的类元素,auto_unlink但是当您调用复制构造函数时,有关节点(is_linked())的信息会丢失。

我有以下代码:

标准输出:

为什么向量copy_nodes没有链接?

谢谢。

0 投票
1 回答
220 浏览

c++ - Boost::IntrusiveList 与共享指针

所以我正在使用 FastDelegate<> 和 boost 库编写一个事件处理系统。我需要为监听器设置一个指向事件数据的共享指针队列以及一个 FastDelegate> 列表。所以这就是问题所在。

侵入式列表和队列不允许 shared_ptr 甚至常量引用,这使我的代码导致编译时错误。无论如何,我可以做到这一点?

将共享 ptr 交给代表似乎是最安全的,这样事件就会一直存在,直到每个人都真正完成它。