#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, и также предназначены только для внутреннего использования.