Цикл в std :: set by index - PullRequest
       22

Цикл в std :: set by index

0 голосов
/ 28 июня 2018

Я делаю программу, которая обрабатывает динамические графики. Узлы и дуги - это два класса, они запоминаются в массиве в графическом объекте, и все они индексируются с помощью пользовательских идентификаторов (которые являются позицией этого элемента в массиве). У каждой дуги есть идентификаторы 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) содержит фактические указатели. Идентификатор каждого элемента равен его позиции в списке графа.

1 Ответ

0 голосов
/ 28 июня 2018

Это похоже на подверженную ошибкам стратегию очистки, но для улучшения, вероятно, потребуется переписать значительно больше, чем предусмотрено в вопросе. (Я подозреваю, что общие и слабые указатели могут упростить вещи.) Поскольку мне не хватает информации, чтобы предложить лучшую структуру данных:

Для набора проще получить доступ к элементу первый , *list_arc.begin(), чем к последнему. (Не большая разница, но все же легче.)

...