簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM