Путаница в отношении одного элемента в большем количестве boost::intrusive контейнеров

Я не совсем понимаю, как возможно, что одни и те же элементы могут появляться в разных навязчивых контейнерах, в то время как сохранение производительности и использование памяти гарантируют, что boost::intrusive документация состояний.

В документации сказано, что:

Интрузивный контейнер не хранит копии переданных объектов, но хранит сами объекты. Дополнительные данные, необходимые для вставки объекта в контейнер, должны быть предоставлены самим объектом. Например, чтобы вставить MyClass в навязчивом контейнере, который реализует связанный список, MyClass должен содержать необходимые следующие и предыдущие указатели:

class MyClass
{
   MyClass *next;
   MyClass *previous;
   // ...
};

Подчеркивая различия между контейнерами STL и boost::intrusive, в документации также говорится:

Ненавязчивый контейнер имеет некоторые ограничения:

Объект может принадлежать только одному контейнеру: если вы хотите разделить объект между двумя контейнерами, вам нужно либо сохранить несколько копий этих объектов, либо использовать контейнеры с указателями: std::list<Object*>,

Имеет смысл, элемент не может быть в двух std::lists. Хорошо. Но как один экземпляр типа 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 для примера того, как сделать это с несколькими навязчивыми константами.

Это имеет некоторые ограничения - вы не можете включать свои объекты в произвольный набор из нескольких навязчивых контейнеров, определенных во время выполнения - вы должны знать, какие контейнеры вы хотите использовать, когда вы изначально их кодируете, и создавать знания о каждом из них. в ваши объекты.

Другие вопросы по тегам