2016-12-06 10 views
0

コンテキスト:MaxFlowのPush-Relableアルゴリズムをネットワーク上で実装していて、すべてのノードのラベルをトラックごとに追跡したいと考えています(2*V-1多数)そのラベルを持つノードを含む二重リンクリストを持ちます。std :: list :: iteratorの保存と管理

私は各エントリがリストであるベクトルを持っています。今では、あるリストから要素を削除し、それを別のベクトルエントリの別のリストに移動する必要があります。 そうするために、各要素がインターレーターであるベクトル(要素の数に等しいサイズ)を使用するので、私は常に各要素の位置を知っています。 それをもっと大きな規模で実装する前に、私はそれがまったく機能するかどうか試してみたかったのです。したがって、2つのベクトルを作成し、リストに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]); 

答えて

1

B[i].end()は、あなたがプッシュされ、最後の項目を参照していない、それはあなたがプッシュアイテム過去のものです。

は何が欲しいのです。また

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

、代わりに一backを使用しての、あなたが新たに挿入されたアイテムのイテレータを返すインサート部材の機能を使用することができます。

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

今私は愚かだと感じる。どうもありがとうございました! – PeterGarder

関連する問題