【问题标题】:Boost.Intrusive - Constant time IteratorBoost.Intrusive - 恒定时间迭代器
【发布时间】:2020-05-10 02:30:11
【问题描述】:

Boost.Intrusive 可以在恒定时间内从 Object-Ref 或 Object-Pointer 中获取迭代器(参见此处:https://www.boost.org/doc/libs/1_72_0/doc/html/intrusive/usage_when.html)。这是如何运作的?为什么标准容器无法做到这一点?

【问题讨论】:

    标签: c++ boost stl containers


    【解决方案1】:

    根据定义,侵入式容器具有包含在元素内部的信息,以了解它们在容器中的位置。一个简单的例子是侵入式链表:

    struct Object {
        Object* next;
        int some_data;
    };
    

    显然,如果我有一个指向 Object 的引用或指针,我可以很容易地找到 next 字段,然后从那里移动到下一个元素,这只是访问一个成员,即 O(1) ,因此是常数时间迭代器。

    使用非侵入式容器,它看起来像这样:

    struct Object {
        int some_data;
    };
    

    假设我有一个std::vector,以及一个指向Object 的指针或引用,如果不扫描容器以找到它,我就无法从它向后工作到它在std::vector 中的位置(a O (n) 操作)。

    【讨论】:

    • 感谢您的回答。好的,我了解侵入式容器的工作原理,但我仍然不确定标准容器。以 std::list 为例,我读到它是使用双向链表实现的,因此它应该为包含“下一个”和“上一个”指针的节点分配内存,还应该为对象本身分配内存,或者至少是一个指向物体。如果对象本身是该节点的一部分,它是否也应该可以获得迭代器?还是它们只是安全指针?
    • 如果您知道您的对象位于std::list 节点内,那么理论上您可以使用该知识来获取指针。但是,给定一个任意对象引用,你怎么知道它在容器中呢?这不是一个安全的操作,所以他们不允许这样做。
    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多