Я делаю программу, которая обрабатывает динамические графики. Узлы и дуги - это два класса, они запоминаются в массиве в графическом объекте, и все они индексируются с помощью пользовательских идентификаторов (которые являются позицией этого элемента в массиве).
У каждой дуги есть идентификаторы 2 узлов, к которым она подключена, у каждого узла есть список идентификаторов всех дуг, с которыми она связана. (все хранится в наборах)
Деструктор дуги удаляет свой идентификатор из набора дуг узлов, к которым он подключен.
Теперь я пишу деструктор узла. Он должен вызывать деструктор каждой дуги, пока его набор не станет пустым. Я не могу перебрать множество с помощью итератора, поскольку каждый шаг деструктора дуги удаляет его идентификатор из самого набора.
Следовательно, мне нужно будет всегда обращаться к последнему элементу, пока набор не будет пустым; но std :: set не позволяет индексировать, как массивы и векторы, и не имеет «назад», как списки и стеки. Как я могу это сделать?
соответствующий код:
graph::arc::~arc()
{
owner->list_node[n1]->remove_arc(id);
owner->list_node[n2]->remove_arc(id);
owner->list_arc[id] = nullptr;
}
graph::node::~node()
{
while (!list_arc.empty())
{
owner->remove_arc(list_arc[list_arc.size()-1]); //invalid, that's roughly what i want to achieve
}
owner->list_node[id] = nullptr;
}
Примечания
владелец - объект графа. owner-> list_ (node / arc) содержит фактические указатели. Идентификатор каждого элемента равен его позиции в списке графа.