上下文:我正在网络中实现 MaxFlow 的推送相关算法,并希望跟踪所有节点的标签,对于我想要的每个可能的标签(2*V-1
很多)有一个包含带有该标签的节点的双向链表。
所以我有一个 vector ,其中每个条目都是一个列表。现在我需要从一个列表中删除一个元素并将其移动到另一个 vector 条目中的另一个列表中。
为此,我使用了一个 vector (其大小等于元素的数量),其中每个条目都是一个interator,所以我总是知道每个元素的位置。
在更大规模地实现它之前,我想尝试一下它是否有效。所以我创建了两个 vector ,将一个元素添加到列表中,将迭代器存储在另一个 vector 中并尝试再次删除该元素。
但是 std::vector::erase()
方法总是让我遇到 SegFaults。我错过了什么吗?
int V=50;
int i=0, v=42;
vector<list<int> > B(2*V-1);
vector<list<int>::iterator> itstorage(V) ;
B[i].push_back(v);
itstorage[v]=B[i].end();
B[i].erase(itstorage[v]);
最佳答案
B[i].end()
不是指你推送的最后一个项目,它是你推送的项目之后的一个。
你想要的是:
std::list<int>::iterator p = B[i].end();
--p;
或者,您可以使用 insert 成员函数,而不是使用 push_back,它返回一个迭代器到新插入的项目。
itstorage[v] = B[i].insert(B[i].end(), v);
关于c++ - 存储和管理 std::list::iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41002809/