问题标签 [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 投票
2 回答
4029 浏览

c++ - Boost.Intrusive 和 unordered_map

我正在寻找使用侵入性 unordered_map。出于某种原因,库中只有一个 unordered_set。还有一个侵入式哈希表,但我不确定它是否具有相同的功能,也没有相同的接口。
我错了吗,我错过了 unordered_map 链接?
如果我没有,是否有一个教程可以帮助我实现一个?

0 投票
3 回答
1660 浏览

c++ - Boost Intrusive List 钩子

Boost::Intrusive 库中的基本钩子和成员钩子有什么区别,什么时候使用一个比另一个更好?

我已经阅读了 boost 文档,但它不是那么解释性的。

0 投票
6 回答
1788 浏览

c# - 如何使 C# 中的侵入式树类使用泛型?

在 C# 中,我有一个侵入式树结构,如下所示:

可以添加到树中的各种对象继承自NodeContainer取决于它们是否可以具有子级。

通过创建Container一个内部类,这意味着它可以访问私有成员Node来管理容器的子列表。

这一切都很好。但是现在我希望使它成为通用的,这样我就可以在保持类型安全的同时重用它——基本上将所有的树功能移动到 Node 之上的一个泛型类和另一个在 Node 和 Container 之间。这是我正在尝试做的粗略设计:

当然,这不起作用,因为您不能GenericContainer继承自Node(编译器错误CS0689)。即使我放弃了内部类要求(例如,通过internal在我自己的库中使用并小心谨慎),我仍然无法找出不会遇到相同问题(和错误)的设计。

(我不认为我必须这样做,只是把它拼出来:我不是试图“修复”编译错误,我也不是在寻找一个简单的树实现。这是一个容器设计问题。)

所以现在我有点难过。有没有人对如何设计这个东西有更好的想法?

编辑:一定要看看这个答案,这是设计的另一个尝试,它试图使用扩展方法来避免将类“注入”到继承层次结构中的问题(但不幸的是不能完全工作)。

0 投票
1 回答
789 浏览

c++ - unique_ptrs 的侵入性列表?

我有一个高度多线程的程序,它包含一个侵入性的对象链接列表。我需要将此列表中的对象传递给多个线程,但一次只有 1 个线程拥有该对象,这意味着我不需要共享该对象或指向它的指针。

我想使用 boost 创建一个带有 unique_ptr 的侵入性列表,但从我读过的内容来看,unique_ptr 与 Boost 侵入式库不兼容,因为它没有正确的所有权语义。

根据这个,侵入式库要求它的元素(指针)具有与原始指针相同的所有权语义。所以 unique_ptr 甚至 shared_ptr 都不符合条件。

我想知道是否有人可以就如何最好地实现我的侵入式列表给我一些建议,以便我可以安全地通过多个线程传递它的元素并知道它们被移动到该线程而不是在线程之间共享?

0 投票
3 回答
1825 浏览

c++ - C++ CRTP 和从基访问派生的嵌套类型定义

编辑:当我为任何感兴趣的人改变我的设计时,我会在这里放一个 github 链接。

背景

我正在用我自己的实现替换boost::intrusive, intrusive_set,因为 64 位编译的侵入集将 3 x 8 字节的指针填充到我的容器节点中。我的容器有 2^16 个节点的限制,因此我可以使用 2x 16 位偏移序数将其降低到每个节点 4 字节(大小减少 6 倍)。

在下面的示例中base是 intrusive-set 容器。该类derived有一个std::vector<container_entry_type<entry_type> >. 显然,在这种间接级别下,我需要在派生中拥有一堆嵌套的 typedef,我想在 base.xml 中引用它们。

ps,容器用于数据描述语言的AST。因此,包含的元素是小型数据类型,并且 3 x 8 字节非常重要。尤其是因为容器用于在紧密循环中验证数据集。

孤立的问题

我想实现以下语义:

但我无法从基础访问嵌套的 typedef。对于这件事,clang 是这么说的:

相反,我必须这样做:

这是实现我的用例的唯一方法吗?它只会让事情变得更加冗长。我想派生也可以从特征派生以节省一些击键。

另一种选择是不使用推导并将逻辑直接连接到当前推导的内容中。但是,我想单独对基础进行单元测试。

0 投票
2 回答
7676 浏览

c++ - C++ STL Containers 无一例外都无法使用,我们能做些什么呢?

C++ 的假定精神是“你用什么,你付多少”。但是,由于异常及其在 STL 中的广泛使用,这可能会让人非常沮丧。

在任何人说“打开异常”之前,生活对我们必须生活的编程环境并不那么慷慨。我的是内核编程,其中执行环境没有提供足够的 C++ 运行时来展开堆栈等。

当 STL 容器无法为其底层后备存储重新分配存储时,它们将抛出分配失败异常。当环境中未启用异常时,程序将相当神秘地崩溃:我已经看到实现直接中止,或者只是假设分配有效,即使它没有。

我遇到的许多 C ADT 库通过返回错误代码或将错误作为输出参数来预先处理此问题。

处理这个问题的“最佳”C++ 方法是什么?

澄清

我不想使用标准库,我不能。我不是在问“我怎么做不能做的事”。我在问:“给定一个干净的石板,容器库应该如何构建。”

0 投票
1 回答
742 浏览

c++ - 在 C++11 模式下使用 GCC 在 1.48 中破坏了 Boost Intrusive unordered_set

如果您对 GCC 4.7 和 Boost 1.48 附带的 Fedora 17 进行香草安装,并使用 C++11 模式,则 Boost Intrusive 的 unordered_set 将被破坏。在带有 GCC 4.6.2 和 Boost 1.47 的 Fedora 16 上,它可以工作。这破坏了真实的代码,甚至破坏了官方文档中的示例:

错误信息:

/usr/include/boost/intrusive/hashtable.hpp:227:65: 错误:使用已删除的函数 'constexpr boost::intrusive::detail::bucket_traits_impl >::type>::bucket_traits_impl(const boost::intrusive: :detail::bucket_traits_impl >::type>&)'</p>

在来自 /usr/include/boost/intrusive/hashtable.hpp:30:0、来自 /usr/include/boost/intrusive/unordered_set.hpp:18、来自 t.cpp:23 的文件中:

/usr/include/boost/intrusive/detail/hashtable_node.hpp:80:8: 注意:'constexpr boost::intrusive::detail::bucket_traits_impl >::type>::bucket_traits_impl(const boost::intrusive::detail ::bucket_traits_impl >::type>&)' 被隐式声明为已删除,因为 'boost::intrusive::detail::bucket_traits_impl >::type>' 声明了移动构造函数或移动赋值运算符

这是它引用的代码,hashtable.hpp:227:

在 Boost 1.47 中,这是:

BOOST_FWD_REF(TYPE)在我的系统上TYPE &&默认定义为,但如果BOOST_NO_RVALUE_REFERENCES已定义,则变为const TYPE &. 如果我确实这样定义它,代码就会编译!

关于为什么会这样的任何想法?是 GCC 的错、Boost、Fedora 的错还是我的错?

0 投票
2 回答
1205 浏览

c++ - 使用带有常量侵入列表的 BOOST_FOREACH

考虑以下代码,使用 BOOST_FOREACH 宏迭代侵入性列表:

鉴于 boost 版本 1.48,代码在 clang 3.2 (SVN) 和 gcc 4.6.3 中失败,但适用于 gcc 4.5.3。xs对代码使用非 const 限定参数iterate。启用 C++11 后,所有编译器都接受该代码。使用 boost-1.46 时,两个 gcc 版本都接受代码,但 clang 仍然不接受。

手头的代码是对宏的滥用BOOST_FOREACH,还是提升方面的错误?是否有比使用常规 for 循环进行迭代更好的解决方法?

编辑:我将错误消息粘贴到GCCclang的 pastebin (两者都非常冗长)。

0 投票
1 回答
253 浏览

c++ - Boost::Intrusive 中 splay_multiset 的成员钩子实现

我在 Visual C++ 2008 上为我的一个项目实施 boost::intrusive,我偶然发现了一个问题。我正在为 splay_multiset 容器使用 splay 钩子。我已经在 MyClass(下面的代码)下公开定义了 splay 钩子。

问题是,要使用 splay_multiset,无论我选择什么选项(选项 1 或 2,在代码中提到),在这两种情况下我都会看到编译错误。

启用选项 1 时(选项 2 已注释),我看到以下错误:

同时,当启用选项 2(选项 1 被注释掉)时,我没有看到未声明的标识符错误消息,因为这些错误与选项 1 一起出现。但我确实看到如下错误(很明显)。

我的问题是为什么我在第一种情况下会出错?我该怎么做才能通过这个问题?

0 投票
3 回答
937 浏览

c++ - 具有侵入式链表的 C++ 循环依赖

我已经实现了这个侵入式链表:

它可以这样使用:

它可以正常工作,直到您需要两个包含彼此列表的对象:

每个MyEntry1 都持有一个MyEntry2 的列表,每个MyEntry2 只能出现在一个MyEntry1 的列表中;反之亦然。但是,这不会编译,因为成员指针 &MyEntry2::node 是在定义 MyEntry2 之前获取的:

这种有问题的布局实际上没有任何实际语义,这只是我发现的一个理论问题,它可能会限制通用链表的可用性。

有什么方法可以解决这个问题,这不会使列表变得更加不切实际吗?

编辑:这里所有数据结构的布局都是完全定义的。这是因为 LinkedList 的数据成员不依赖有问题的 NodeMember 模板参数;只有函数可以。问题似乎是该语言要求知道 &MyEntry2::node ,即使它当时并不真正需要知道。

编辑:必须可以使用此通用列表将结构添加到两个或多个列表中;这是 NodeMember 模板参数的用途 - 它指定要使用条目中的哪个 LinkedListNode。