Путаница в отношении одного элемента в большем количестве boost::intrusive контейнеров
Я не совсем понимаю, как возможно, что одни и те же элементы могут появляться в разных навязчивых контейнерах, в то время как сохранение производительности и использование памяти гарантируют, что boost::intrusive
документация состояний.
В документации сказано, что:
Интрузивный контейнер не хранит копии переданных объектов, но хранит сами объекты. Дополнительные данные, необходимые для вставки объекта в контейнер, должны быть предоставлены самим объектом. Например, чтобы вставить
MyClass
в навязчивом контейнере, который реализует связанный список,MyClass
должен содержать необходимые следующие и предыдущие указатели:
class MyClass
{
MyClass *next;
MyClass *previous;
// ...
};
Подчеркивая различия между контейнерами STL и boost::intrusive, в документации также говорится:
Ненавязчивый контейнер имеет некоторые ограничения:
Объект может принадлежать только одному контейнеру: если вы хотите разделить объект между двумя контейнерами, вам нужно либо сохранить несколько копий этих объектов, либо использовать контейнеры с указателями:
std::list<Object*>
,
Имеет смысл, элемент не может быть в двух std::list
s. Хорошо. Но как один экземпляр типа MyClass
быть вставлены в два разных boost::intrusive::list
Например, учитывая, что такой элемент может иметь только один указатель на следующий элемент и один на предыдущий элемент. Если я не ошибаюсь, это работает, только если вы предполагаете, что изменение одного контейнера может также изменить другой и наоборот.
1 ответ
Библиотека Boost.Intrusive не просит вас определить prev
а также next
указатели - в той части документации, наличие prev
а также next
указатели - это просто концептуальная иллюстрация того, как работают навязчивые контейнеры.
Фактическое определение навязчивых контейнеров состоит в том, чтобы включить хук через наследование или в качестве члена, который содержит prev
а также next
указатели. Включив несколько хуков (помеченных разными статическими типами), вы можете включить один и тот же объект в несколько разных навязчивых контейнеров (каждый помечен разными статическими типами).
См. http://www.boost.org/doc/libs/1_38_0/doc/html/intrusive/usage.html чтобы увидеть, как работают хуки. Посмотрите этот ответ Stackru для примера того, как сделать это с несколькими навязчивыми константами.
Это имеет некоторые ограничения - вы не можете включать свои объекты в произвольный набор из нескольких навязчивых контейнеров, определенных во время выполнения - вы должны знать, какие контейнеры вы хотите использовать, когда вы изначально их кодируете, и создавать знания о каждом из них. в ваши объекты.