Search code examples
c++listvectorlinked-listiterator

Storing and managing std::list::iterator


Context: I am implementing the Push-Relable Algorithm for MaxFlow in a network and want to keep track of labels of all nodes, for each possible label (2*V-1 many) I want to have a doubly-linked list containing the nodes with that label.

So I have a vector where each entry is a list. Now I need to delete an element from one list and move it into another list in another vector-entry. In order to do so, I use an vector (which size is equal to the number of elements) where each entry is an iterator, so I always know the position of each element. Before implementing it on a bigger scale I wanted to try whether it works at all. So I create the two vectors, add one element into a list, store the iterator in the other vector and try to delete that element again. But the std::vector::erase() method always gets me SegFaults. Did I miss something?

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]);

Solution

  • B[i].end() does not refer to the last item you pushed, it is one past the item you pushed.

    What you want is:

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

    Alternatively, instead of using push_back, you could use the insert member function which returns an iterator to the newly inserted item.

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