Путаница в отношении одного элемента в более мощных :: навязчивых контейнерах

Я не совсем понимаю, как возможно, что одни и те же элементы могут появляться в разных навязчивых контейнерах, в то время как сохранение производительности и использование памяти гарантируют, что 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 не litterally прошу вас определить prev а также next указатели — в той части документации, наличие prev а также next указатели — это просто концептуальная иллюстрация того, как работают навязчивые контейнеры.

Фактическое определение навязчивых контейнеров состоит в том, чтобы включить хук через наследование или в качестве члена, который содержит prev а также next указатели. Включив несколько хуков (помеченных разными статическими типами), вы можете включить один и тот же объект в несколько разных навязчивых контейнеров (каждый помечен разными статическими типами).

Увидеть http://www.boost.org/doc/libs/1_38_0/doc/html/intrusive/usage.html чтобы увидеть, как работают крючки. Увидеть этот ответ StackOverflow для примера того, как сделать это с несколькими навязчивыми contianers.

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]