Хотим оптимально хранить движущихся юнитов
set<unit*> units;
set<unit*> moving_units;
Можно заменить moving_units на двухсвязанный список с next и prev (intrusive_list)
Units можно связать так же
template<typename Tag = defaltH_tag>
struct node {
node *next, *prev;
}
unit* toUnit(node* p) }
return (unit*) ((char*)p - offsetof(unit, link));
}
В с++ унаследоваться и просто статик каст от базового к производному
struct unit : node<struct all_units_tag> { }
intrusive_list<unit, struct all_units_tag>;
| intrusive | not-intrusive | |
|---|---|---|
| memory size (не всегда) | less? (+) | greater? |
| number of alloc | smaller (+) | bigger |
| скорость итераций | обычно быстрее | обычно медленнее |
| require object modification | YES (-) | No |
| containers | non-copyable (-) | copyable |
| container manages lifetime of objects | NO (critical) (-) | Yes |
| exception safety guarantees | better (mostly nothrow) (+) | worse |
| value -> iterator | allow (+) | disallow |