Указатели в boost :: intrusive :: splay_set - PullRequest
0 голосов
/ 27 марта 2012

Я сейчас пытаюсь узнать, как использовать библиотеку boost, и наткнулся на проблему с boost :: intrusive :: splay_set (или splaytree в этом отношении).

Давайте предположим, что я хочу иметь Splay Tree, который сохраняет указатели на класс Category (поэтому Category *). Я пытаюсь написать следующее

splay_set<Category*, compare<std::greater<Category*>>> CategoriesSplay

К сожалению, это не работает. Я не буду писать ошибки, которые он генерирует, так как он превышает 100, а Visual Studio завершает процесс компиляции.

Затем я попытался изменить класс, чтобы мой класс Category расширялся до

class Category : public splay_set_base_hook<link_mode<auto_unlink>, Category*> 

Опять не повезло. изменение Category * во втором коде на void_pointer (Category) также не работает. К сожалению, поддержка документации не помогает в добавлении указателей к навязчивым наборам сплайнов.

У кого-нибудь есть решение моей проблемы? Заранее спасибо.

1 Ответ

0 голосов
/ 31 мая 2012

Две вещи:

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

splay_set<Category, compare<std::greater<Category>>> CategoriesSplay

Во-вторых, вам необходимо реализовать элементы данных в вашем классе, необходимые для работы контейнера.Самый простой способ - просто унаследовать от базового класса «hook», например:

class Category : public splay_set_base_hook<> {
...

Помните: навязчивые контейнеры не управляют памятью содержащихся в них объектов, как контейнеры STL.Вам нужно выделить свой объект до того, как вы вставите его в контейнер и обязательно удалите его при удалении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...