[英]Storing and managing std::list::iterator
上下文:我正在網絡中實現針對MaxFlow的Push-Relable算法,並希望跟蹤所有節點的標簽,對於每個可能的標簽(很多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]);
B[i].end()
不引用您推送的最后一個項目,而是您推送的項目的最后一個。
您想要的是:
std::list<int>::iterator p = B[i].end();
--p;
或者,可以使用insert成員函數來代替push_back,該函數將迭代器返回到新插入的項目。
itstorage[v] = B[i].insert(B[i].end(), v);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.