Как вызвать простое красно-черное дерево, используя xtree в STL?

#c #stl

#c #stl

Вопрос:

В xtree в STL есть класс красно-черного дерева (называемый _Tree). Моя цель — создать объект этого класса, чтобы у меня могло быть минимальное красно-черное дерево. Тем не менее, конструктора по умолчанию нет. Предполагается, что класс наследуется только другими классами (для использования наборов и мультимножеств и тому подобного).

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

Комментарии:

1. Под «STL» вы имеете в виду стандартную библиотеку, поставляемую с ISO C , или вы имеете в виду что-то другое? В стандартной библиотеке ISO этого нет _Tree .

2. @Tim: Это класс внутренней реализации, либо с Dinkumware, либо с его производной от MSVC.

3. ОК. В таком случае, я думаю, что называть его «STL» вводит в заблуждение.

4. Извините, ребята. Я думал, что xtree есть в STL. Я не знаю, что я делаю на самом деле.

5. Какого способа std::set недостаточно для ваших нужд?

Ответ №1:

Напишите свое собственное. Нет, правда — вам никогда не следует вмешиваться в детали чужой реализации. Тем более, что std::set эта функциональность уже предоставляется.

Комментарии:

1. Как известно, написать собственное RB-дерево непросто, поэтому повторное использование существующей реализации — неплохая идея. Лучшим советом может быть поиск библиотеки RB-tree, предназначенной для повторного использования. Реализации стандартной библиотеки обычно оптимизированы для выполнения требований стандартных контейнеров ISO с максимальной производительностью, а не для того, чтобы быть повторно используемыми компонентами, расширяемыми пользователем.

2. То есть вы хотите сказать, что красно-черное дерево в xtree не должно быть реализовано пользователем? Я подумал, что, возможно, я мог бы добавить некоторый код, чтобы создать из него объект, но я чувствую, что для этого требуется расширенное знание файла заголовка xtree. Я надеялся, что, возможно, существует более простой способ сделать это, который я упускаю из виду. Еще раз спасибо за эти ответы, они очень полезны.

3. @Rob: Вы совершенно не должны даже читать это, не говоря уже о том, чтобы что-то с этим делать. Просто используйте std::set — вот для чего это нужно.

4. @Rob: Да ладно, просто не делай этого. Если вы удалите <set> , переустановите свою библиотеку. Просто не трогайте внутренние материалы.

5. @Rob: Вероятно, вы можете повторно загрузить <set> с веб-сайта вашего компилятора или получить его с любого используемого вами установочного носителя или даже с автоматического средства восстановления.

Ответ №2:

[Повторите мою перенастройку: я предположил, что вы используете Dinkumware STL (учитывая, что вы упомянули xtree заголовок). Измените пометку, если это не так.]

Конечно, вы должны быть в состоянии создать минимальный подкласс _Tree и готово? Тогда вам вообще не нужно будет изменять _Tree класс. (У меня нет копии Dinkumware, поэтому я не могу проверить, работает ли это. Но это кажется разумным попробовать.)

Мой ответ касается только того, что вы можете сделать. Что касается того, что вы должны делать, смотрите другие ответы. 🙂

Ответ №3:

В Dinkumware STL все заголовки, начинающиеся с ‘x’, например. <xutility> , <xtree> , <xxwrap> и так далее, предназначены только для внутреннего использования. Не включайте его, не используйте. Вот так просто. Кроме того, не следует использовать все, что начинается с подчеркивания, за которым следует заглавная буква. Они имеют «уродливый синтаксис», как их называет STL, и также предназначены только для внутреннего использования.