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