按索引循环std :: set

时间:2018-06-28 00:02:32

标签: c++ indexing set std

我正在编写一个处理动态图的程序。节点和圆弧是两个类,它们存储在图形对象的数组中,并且全部通过自定义ID(即该项目在数组中的位置)进行索引。 每个弧都有其连接的2个节点的ID,每个节点都有其连接的所有弧的ID的列表。 (全部存储在集中) 弧的析构函数从其连接的节点的弧集中删除其ID。

现在我正在写节点的析构函数。它应该调用每个弧的析构函数,直到其集合为空。我无法使用迭代器在集合中进行迭代,因为弧形析构函数的每一步都会从集合本身中删除其ID。

因此,我需要始终访问最后一个元素,直到集合为空;但是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)保存实际的指针。每个项目的ID都等于其在图形列表中的位置。

1 个答案:

答案 0 :(得分:1)

这看起来像是一个易于出错的清除策略,但是要进行改进,可能需要重写的内容远远多于问题中提供的内容。 (我怀疑共享指针和弱指针可以简化事情。)由于我缺乏足够的信息来建议更好的数据结构:

对于集合,访问 first 元素*list_arc.begin()比最后一个元素容易。 (相差不大,但仍然更容易。)