История изменений
Исправление
ckotinko,
(текущая версия)
:
template <int n=1> struct Links {Node * link[n];};
std::unordered_multimap<Node*,size_t> map;
std::vector<Links<10>> links;
std::vector<size_t> unused_links;
добавление ссылки: берешь ноду, идёшь в multimap, получаешь там equal_range. ищешь в этом range индекс, по которому в векторе найдется структура с со, в котором есть свободное место и туда суешь указатель. если не нашел, берешь из unused_links либо создаешь новый элемент в векторе links.
удаление связи: берешь ноду, идёшь в multimap, получаешь там equal_range, ищешь в списке блоков тот где есть указатель на другую ноду и нулишь его. Если в ноде больше нет ненулевых указателей, удаляешь соотв итератор из map, и индекс заносишь в unused_links.
делать надо в обе стороны чтоб не было висячих ссылок(т.е. А->B и B->A)
еще можно links заменить на std::list, подпертый boost::pool_allocator, тогда unused_links не нужно, можно прям так deletить из этого списка, а в map хранить не size_t а std::list<Links<n>>::iterator
Исходная версия
ckotinko,
:
template <int n=1> struct Links {Node * link[n];};
std::unordered_multimap<Node*,size_t> map;
std::vector<Links<10>> links;
std::vector<size_t> unused_links;
добавление ссылки: берешь ноду, идёшь в multimap, получаешь там equal_range. ищешь в этом range индекс, по которому в векторе найдется структура с со, в котором есть свободное место и туда суешь указатель. если не нашел, берешь из unused_links либо создаешь новый элемент в векторе links.
удаление связи: берешь ноду, идёшь в multimap, получаешь там equal_range, ищешь в списке блоков тот где есть указатель на другую ноду и нулишь его. Если в ноде больше нет ненулевых указателей, удаляешь соотв итератор из map, и индекс заносишь в unused_links.
делать надо в обе стороны чтоб не было висячих ссылок(т.е. А->B и B->A)