2009-08-05 6 views
0

довольно забавный вопрос у меня есть.еще одно дерево STL вопрос

Я сейчас работаю над парсером HTML, и я использовал вектор для всех моих целей ввода, которые казались довольно хорошими и быстрыми для создания дерева.

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

Я прочитал несколько статей о деревьях и их реализации, и я думал о std :: карте для этой цели.

Что-то вроде этого:

std::map< element, *child_map >

Так что, когда я думал о вставке тега где-то между ними и с ними все заказанные каким-то ключом (например, уникальный целочисленный идентификатор) Я до сих пор есть проблемы, чтобы обновить все ключи в ветке после вставки.

, например: 1: SCRIPT 2: НАЧАЛЬНИК 3: BODY

Когда я хочу, чтобы вставить новый элемент «SCRIPT» после того, как ГОЛОВЕ мне нужно будет увеличивать тело ключа 4 и иметь л, как это : 1: SCRIPT 2: НАЧАЛЬНИК 3: SCRIPT 4: BODY

Кажется немного громоздким для меня. Я что-то не хватает?

В качестве альтернативы я думал об осуществлении вместо list<pair<>>. Таким образом, сортировка не определяется ключом, и я могу добавлять элементы в любом месте без каких-либо дополнительных обновлений.

+0

Уточните, пожалуйста, что именно вы хотите сохранить в ключе карты? Заказ тега? – Dewfy

ответ

2

Я хотел бы сделать ребенка установить элемент элемента и использовать зЬй :: список:

class Element { 
/* ... */ 
    std::list<boost::shared_ptr<Element> > children; 
/* ... */ 
}; 

Тем не менее, вы можете посмотреть в использовании существующей библиотеки DOM вместо прокатки свой собственный. Например, вы можете использовать htmlcxx.

+0

список элементов Element * немного сложнее очистить (вам нужно вручную удалить детей в деструкторе или в другом месте) и усложняет владение при отсоединении элементов от их родителей. Я бы очень рекомендовал использовать какой-то умный указатель для такого рода случаев. – bdonlan

+0

Спасибо. Отличная идея! Это именно то, что мне нужно. На самом деле, я просто писал почти идентичную реализацию, прежде чем я нашел ваш ответ. – Andrew

+0

спасибо! Абсолютно согласен. – Andrew

0

< Список пара> будет работать хорошо, чтобы смоделировать любую форму структуры дерева, такие как то, что вы пытаетесь сделать:

< список пар < «HTML», список> позволит вам хранить произвольное число детей, а также контролировать порядок объектов в списке дочерних элементов.

Удачи в этом дереве.

 Смежные вопросы

  • Нет связанных вопросов^_^