Хотим оптимально хранить движущихся юнитов
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 |