Iterator for second to last element in a list

Viewed 21492

I currently have the following for loop:

for(list<string>::iterator jt=it->begin(); jt!=it->end()-1; jt++)

I have a list of strings which is in a larger list (list<list<string> >). I want to loop through the contents of the innerlist until I get to the 2nd to last element. This is because I have already processed the contents of the final element, and have no reason to process them again.

However, using it->end()-1 is invalid -- I cannot use the - operator here. While I could use the -- operator, this would decrement this final iterator on each cycle.

I believe a STL list is a doubly linked list, so from my perspective, it should be possible to do this.

Advice? Thanks in advance

5 Answers

In c++11 and later, the best answer appears to be to use std::prev

for(iterator i = lst.begin(); i != std::prev(lst.end()); ++i) {
    // do
    // stuff
}

The documentation for std::prev on http://en.cppreference.com/w/cpp/iterator/prev says,

Although the expression --c.end() often compiles, it is not guaranteed to do so: c.end() is an rvalue expression, and there is no iterator requirement that specifies that decrement of an rvalue is guaranteed to work. In particular, when iterators are implemented as pointers, --c.end() does not compile, while std::prev(c.end()) does.

I believe std::prev() on an empty list is undefined, so you may need to wrap this in a !i.empty() condition

Related