c++ - 在 std::set by index 中循环

标签 c++ indexing set std

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

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

因此,我需要始终访问最后一个元素,直到集合为空;但是 std::set 不允许像数组和 vector 那样进行索引,并且它没有像列表和堆栈那样的“后退”。我该怎么做?

相关代码:

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 等于它在图表列表中的位置。

最佳答案

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

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

关于c++ - 在 std::set by index 中循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072969/

相关文章:

c++ - QextSerialPort (QIODevice) 的 readRead() 信号调用速度不够快

c++ - 函数不读取和打印 C++ 中的文件内容

mysql - 对大表使用 LIKE 操作时 MySQL 查询速度变慢

mysql - mySQL 索引从什么时候开始对简单选择产生影响?

java - HashSet 中有多少个唯一对象以及使用哪个方法检查唯一性等于或 hashCode

c++ - 为什么是 0022FF08 + sizeof(int) = 0022FF0C 而不是 0022FF0A?

c++ - 从魔数(Magic Number)到 int 或 long 的重载解析(在 range-v3 中)

python - 从提取的 JSON 时间索引中获取分钟,与当前时间进行比较。

python - 附加到集合的对象是 `NoneType` python 2.7

haskell - 如何实现haskell `\\`函数?