Question

I need to iterate over some elements in backward order and I'm using:

for ( /* ... */ it = vec.end() - 1, end = vec.begin() ; it >= end ; --it ) {
    // ...

I now that end() - 1 is defined for some containers, including vector, but now I need to know if begin decrement is also defined.

EDIT

I don't know if I could use reverse_iterator, because I'll need to pass these iterators as parameters to std::vector::erase and from the documentation, it looks that they are different types.

Was it helpful?

Solution

Yes, it is undefined.

If you want to iterate over elements in reverse, just use rbegin and rend. They're reverse iterators, designed explicitly for this purpose. If you need to get a standard iterator from the reverse iterator, you can use the base member function on the iterator.

OTHER TIPS

It is undefined behaviour. But why not use reverse iterators rbegin() and rend()?

std::vector<int> vec{0,1,2,3,4}
for (auto it = vec.rbegin(); it != vec.rend(); ++it) 
{
  std::cout << *it << " ";
}
std::cout << std::endl;

output

4 3 2 1 0

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top