存储和管理std::list::iterator

问题描述 投票:0回答:1

上下文:我正在网络中实现 MaxFlow 的推送可靠算法,并希望跟踪所有节点的标签,对于每个可能的标签(

2*V-1
很多)我想要一个包含节点的双向链表那个标签。

所以我有一个向量,其中每个条目都是一个列表。现在我需要从一个列表中删除一个元素并将其移动到另一个向量条目中的另一个列表中。 为此,我使用一个向量(其大小等于元素数量),其中每个条目都是一个迭代器,因此我始终知道每个元素的位置。 在更大规模地实施之前,我想尝试一下它是否有效。因此,我创建两个向量,将一个元素添加到列表中,将迭代器存储在另一个向量中,然后尝试再次删除该元素。 但是

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]);
c++ list vector linked-list iterator
1个回答
1
投票

B[i].end()
不是指您推送的最后一项,而是您推送的一项之后的一项。

你想要的是:

std::list<int>::iterator p = B[i].end();
--p;

或者,您可以使用 insert 成员函数,而不是使用 Push_back,该函数将迭代器返回到新插入的项目。

itstorage[v] = B[i].insert(B[i].end(), v);
© www.soinside.com 2019 - 2024. All rights reserved.