Implementing list position locator in C++?

Posted by jfrazier on Stack Overflow See other posts from Stack Overflow or by jfrazier
Published on 2012-04-01T22:36:06Z Indexed on 2012/04/01 23:29 UTC
Read the original article Hit count: 227

Filed under:
|

I am writing a basic Graph API in C++ (I know libraries already exist, but I am doing it for the practice/experience). The structure is basically that of an adjacency list representation. So there are Vertex objects and Edge objects, and the Graph class contains:

list<Vertex *> vertexList
list<Edge *> edgeList

Each Edge object has two Vertex* members representing its endpoints, and each Vertex object has a list of Edge* members representing the edges incident to the Vertex.

All this is quite standard, but here is my problem. I want to be able to implement deletion of Edges and Vertices in constant time, so for example each Vertex object should have a Locator member that points to the position of its Vertex* in the vertexList. The way I first implemented this was by saving a list::iterator, as follows:

vertexList.push_back(v);
v->locator = --vertexList.end();

Then if I need to delete this vertex later, then rather than searching the whole vertexList for its pointer, I can call:

vertexList.erase(v->locator);

This works fine at first, but it seems that if enough changes (deletions) are made to the list, the iterators will become out-of-date and I get all sorts of iterator errors at runtime. This seems strange for a linked list, because it doesn't seem like you should ever need to re-allocate the remaining members of the list after deletions, but maybe the STL does this to optimize by keeping memory somewhat contiguous?

In any case, I would appreciate it if anyone has any insight as to why this happens. Is there a standard way in C++ to implement a locator that will keep track of an element's position in a list without becoming obsolete?

Much thanks, Jeff

© Stack Overflow or respective owner

Related posts about c++

Related posts about list