C++ std中的循环::按索引设置

C++ std中的循环::按索引设置,c++,indexing,set,std,C++,Indexing,Set,Std,我正在制作一个处理动态图形的程序。节点和弧是两个类,它们存储在图形对象的数组中,并且都由自定义ID索引,这些ID是该项在数组中的位置。 每个弧都有其连接的2个节点的ID,每个节点都有其连接到的所有弧的ID列表。全部成套存储 圆弧的析构函数从其连接的节点的圆弧集中删除其id 现在我正在编写节点的析构函数。它应该调用每个弧的析构函数,直到其集合为空。我不能用迭代器遍历集合,因为arc析构函数的每一步都是从集合本身删除其id 因此,我需要始终访问最后一个元素,直到集合为空;但是std::set不允许像

我正在制作一个处理动态图形的程序。节点和弧是两个类,它们存储在图形对象的数组中,并且都由自定义ID索引,这些ID是该项在数组中的位置。 每个弧都有其连接的2个节点的ID,每个节点都有其连接到的所有弧的ID列表。全部成套存储 圆弧的析构函数从其连接的节点的圆弧集中删除其id

现在我正在编写节点的析构函数。它应该调用每个弧的析构函数,直到其集合为空。我不能用迭代器遍历集合,因为arc析构函数的每一步都是从集合本身删除其id

因此,我需要始终访问最后一个元素,直到集合为空;但是std::set不允许像数组和向量这样的索引,它也没有像列表和堆栈那样的back。我该怎么做

相关代码:

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;
    }
注释
所有者是图形对象。所有者->列表\节点/arc保存实际指针。每个项目的id都等于它在图表列表中的位置。

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


对于集合,访问第一个元素*list_arc.begin比访问最后一个元素更容易。差别不大,但更简单。

我坚持使用集合,因为每次插入都会对集合进行排序。关键是,节点删除不应该经常发生,所以如果它的开销比其他操作稍微大一点,我就没事了。我还想允许删除弧,因此弧析构函数实际上需要从它所接触的节点中删除它的引用。这就是节点删除变得奇怪的原因。此外,我更多地使用索引层,因为我更容易使用它,但一旦我使用完所有的逻辑,它很容易被指针替换。感谢您的回答,我将尝试使用begin方法。@使用集合的BANACK与使用智能指针简化清理并不矛盾。如果您100%确定代码的特定部分不会出现内存泄漏,为什么要使用智能指针?对我来说,这似乎是一个毫无意义的开销,@Barnack智能指针使清理代码更简单:更易于编写、阅读和维护。作为第二个特性,它们还可以避免一些内存泄漏的情况,尽管有人100%确定没有泄漏。开销往往类似于手动避免内存泄漏所需的开销。