Ever wonder how the STL list works in GCC?
What? No? You haven't?
Where's your sense of curiousity about the way your code works?
What? You have a life?!? What are you reading this blog for then?
Anyway, it's pretty simple. It's a doubly-linked list, where the node has a previous and next pointer. The head and tail of the list are linked together, and the list itself keeps a pointer to the head node.
This means that begin() and end() are fast.
Unfortunately, the list doesn't keep a size counter. This means that size() is O(n). So you can find the back of the list easily but getting its index is expensive.
That's probably fine, as turning the index back into an iterator is O(n) and the iterators are stable. By comparison though, CodeWarrior's list caches the number of items.
Moral of the story: empty() is more efficient than size()==0, and, um, know what's in your STL.
(Insert rant about STL being like sausage here...)