Re[2]: visit_tree
От: c-smile Канада http://terrainformatica.com
Дата: 01.07.14 04:12
Оценка:
Здравствуйте, 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 (т.е. поверх массива) — то это вообще тривиально будет.

Не понял что имеется ввиду. Поясни. Элементов много.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.