【发布时间】: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
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
根据定义,侵入式容器具有包含在元素内部的信息,以了解它们在容器中的位置。一个简单的例子是侵入式链表:
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 节点内,那么理论上您可以使用该知识来获取指针。但是,给定一个任意对象引用,你怎么知道它在容器中呢?这不是一个安全的操作,所以他们不允许这样做。