c++ - 在 std::set 按索引循环
问题描述
我正在制作一个处理动态图的程序。节点和弧是两个类,它们被存储在图形对象的一个数组中,并且都由自定义 ids (这是该项目在数组中的位置)进行索引。每个弧都有它连接的 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;
}
Notes 所有者是图形对象。owner->list_(node/arc) 保存实际的指针。每个项目的 id 等于它在图表列表中的位置。
解决方案
这感觉像是一个容易出错的清理策略,但改进可能需要比问题中提供的内容多得多的重写。(我怀疑共享指针和弱指针可以简化事情。)由于我缺乏足够的信息来建议更好的数据结构:
对于一个集合,访问第一个元素 ,比访问最后一个元素更容易*list_arc.begin()
。(差别不大,但更容易。)
推荐阅读
- python-3.x - 使用 pandas 将 float64(从 excel 导入)转换为 str
- powershell - PowerShell:异常的奇怪处理
- tkinter - 使用 Tkinter,如何从数据库中填充子窗口中的组合框?
- python - 如何提示同一子类的实例的同质列表?
- reactjs - MUI 自定义主题不适用
- typescript - 为什么我无法从实现接口的类中推断类型参数?
- laravel - 如何比较laravel中的两个集合
- dns - 种子数据是域层的一部分吗?
- mule - 在mule 4 dataweave 2.0中使用给定字符修剪字符串
- python - 如何使用 Python 从 Oracle 数据库中表中的字符串中排除单词?