Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, c-smile, Вы писали:
CS>>Вопрос можно ли как-нибудь обойтись без этого hash_set ?
CS>>Я в принципе могу добавить скажем так uint поле в element для маркерных целей.
J>Ну точно не hash_set — это тормоза на ровном месте.
CS>>Проблема осложняется еще тем что visitor функтор в принипе тоже может запускать visit_tree для каких-то других своих целей.
J>Ну 640К uint должно хватить для чего угодно.
J>Только их потом придется бегать очищать же. Или у тебя обработка однократная?
Обработка неоднократная. Я в принципе могу прикопать где-то некий mask, типа
static uint generation_mask = 1;
class element {
uint visitor_mask;
element() : visitor_mask(0) {}
void element::visit_tree( std::function<void(element*)> visitor) {
generation_mask <<= 1;
// проверка на bit 0/1 ...
std::function<void(element*)> worker = [&]( element* el) {
if( (visitor_mask & generation_mask) != 0)
return;
visitor_mask ^= generation_mask;
visitor(el);
children.for_each(worker);
visible_children.for_each(worker);
};
worker(this);
generation_mask >>= 1;
}
}
В этом случае глубина вложения visit_tree ограничена 32 что в принципе устраивает.
J>А деревья меняются по ходу дела? Или создаются вначале и так и живут?
J>А то можно ведь параллельную структуру данных завести.
Меняются.
J>Можно ли каждому элементу присвоить номер (в процессе заполнения дерева)? Если да, то вместо hash_set можно использовать просто битовый vector и обращаться к нему по номеру элемента — чистить его очень быстро и легко.
J>Если у тебя flat tree (т.е. поверх массива) — то это вообще тривиально будет.
Не понял что имеется ввиду. Поясни. Элементов много.