2016-12-06 47 views
0

語境:我實現推送Relable算法MaxFlow在網絡中,並希望保持所有節點的標籤的軌道,爲每個可能的標籤(2*V-1很多)我想有一個包含具有該標籤的節點的雙向鏈表。存儲和管理的std ::目錄::迭代器

所以我有一個向量,其中每個條目是一個列表。現在我需要從一個列表中刪除一個元素,並將其移動到另一個向量條目中的另一個列表中。 爲了做到這一點,我使用的載體(至極大小等於元件的數量),其中每個條目是一個迭代符,所以總是知道各元件的位置。 在更大規模實施之前,我想試試它是否可行。所以我創建了兩個向量,將一個元素添加到列表中,將迭代器存儲在另一個向量中,並嘗試再次刪除該元素。 但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

B[i].end()不是指您推送的最後一個項目,而是您推送的項目之後的一個項目。

你想要的是:

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

或者,而不是使用的push_back,你可以使用它返回一個迭代器新插入的項目插入成員函數。

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

現在我覺得很蠢。非常感謝你! – PeterGarder