gpt4 book ai didi

c++ - C++将对象保存在列表中以供以后重用

转载 作者:行者123 更新时间:2023-12-02 09:59:57 26 4
gpt4 key购买 nike

假设我拥有保存在 vector 中的边列表,例如:

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变量所做的更改未反射(reflect) tree中的值。我需要一个列表(可以是任何列表( vector ,链接的,队列,堆栈),其具有像Dijkstra这样的empty() bool(boolean) 值)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. 'pronouns' m.所指出的,迭代器可以被视为“通用指针”,因此常规指针也有许多问题也适用于迭代器。
另一种(稍微更安全)的方法是将 std::shared_ptr s存储在 tree的内部列表中-然后您可以简单地将另一个 std::shared_ptr存储到 aux中的同一对象中,以确保在仍然引用该对象时不会意外删除该对象

关于c++ - C++将对象保存在列表中以供以后重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63153203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com