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

时间:2016-12-06 18:58:04

标签: c++ list vector linked-list iterator

背景信息:我正在为网络中的MaxFlow实现Push-Relable算法,并希望跟踪所有节点的标签,对于每个可能的标签(2*V-1多个)我想要一个双向链表包含具有该标签的节点。

所以我有一个向量,每个条目都是一个列表。现在我需要从一个列表中删除一个元素并将其移动到另一个向量条目中的另一个列表中。 为了做到这一点,我使用一个向量(大小等于元素的数量),其中每个条目是一个interator,所以我总是知道每个元素的位置。 在大规模实施之前,我想尝试一下它是否有效。所以我创建了两个向量,将一个元素添加到列表中,将迭代器存储在另一个向量中并尝试再次删除该元素。 但是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]);

1 个答案:

答案 0 :(得分:1)

B[i].end()没有引用您推送的最后一个项目,它是您推送的项目之后的一个项目。

你想要的是:

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

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

itstorage[v] = B[i].insert(B[i].end(), v);