假设我拥有保存在矢量中的边列表,例如:
typedef struct edge
{
int v;
size_t start;
size_t end;
}e;
typedef vector<list<e>> adj_list;
adj_list tree;
我必须对此tree
对象执行逻辑,但是逻辑太复杂而无法就地执行(仅限于不可递归)。我需要一个额外的数据结构来处理每个节点。作为一个简单的示例,让我们考虑增加每个边的v值:
list<e> aux;
aux.insert(aux.begin(), tree[0].begin(), tree[0].end());
while (!aux.empty())
{
e& now = aux.front();
aux.pop_front();
now.v++;
aux.insert(aux.begin(), tree[now.v].begin(), tree[now.v].end());
}
这样做的问题是,对now
变量所做的更改未反映中的值tree
。我需要一个列表(可以是任何列表(向量,链接的,队列,堆栈),其具有像Dijkstra这样的empty()布尔值)ds来处理我的edge
对象tree
。有没有一种优雅的方法可以做到这一点?我可以使用迭代器列表吗?我特别要求一种“优雅”的方法,希望它不涉及指针。
如评论中所述,解决方案是存储迭代器而不是副本,例如:
list<list<e>::iterator> aux;
aux.insert(aux.begin(), tree[0].begin(), tree[0].end());
while (!aux.empty())
{
e& now = *(aux.front());
aux.pop_front();
now.v++;
aux.insert(aux.begin(), tree[now.v].begin(), tree[now.v].end());
}
仅当您可以确保没有任何东西会使存储的迭代器无效(例如,某些操作tree
可以这样做)时,此方法才有效。
如n所指出的。代词 迭代器可以看作是“通用指针”,因此常规指针也有许多问题也适用于迭代器。
另一种(稍微安全些)的方法是将std::shared_ptr
s存储在的内部列表中tree
-然后您可以简单地将s存储std::shared_ptr
在同一对象中aux
,以确保在仍然引用该对象时不会意外删除该对象
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句