c++ - Vector iterator > vector.end() even though the vector should not have been reallocated -


first: happy update question in title if can think of more concise way put it.

here's situation:

i have vector class member. after extracting element vector following:

inline int currenttoken() {     /* __it of type std::vector <int>::iterator */      return (__it < __tokens.begin()) ? syntax::out_of_range_begin :            (__it > __tokens.end())   ? syntax::out_of_range_end :            *__it; } 

the returned integer expected (in case, 65, should have been).

now things tricky, however. when particular token encountered, sparks new chain of events , previous tokens in vector need discarded.

first, call class' 'savelocation' member function, inline quickie:

__saved_it = __it; 

then, call 'truncatehead' member function, error occurs. before code, point out none of above has in way changed vector, there absolutely no reason vector's memory have been reallocated.

__it = __tokens.erase(__tokens.begin(), __saved_it+1); //segfault 

some debugging has revealed somehow __it greater __tokens.end(), though still both larger __begin and dereferenced number '65' expected.

how not in range between __tokens.begin() , __tokens.end()?

in fact, situation present in savelocation method above.

remembering currenttoken() followed savelocation(), , currenttoken have returned integral representation of out_of_range_end if iterator out of range, flummoxed.

completely , utterly.

tokens.end() returns past end iterator. is, outside of range.

it's not meaningful compare if iterator bigger (>) past end iterator, iterators range begin() end(). because of same reason, not meaningful check if iterator less iterator returned begin().

this means there's no way of checking if iterator out_of_range_begin or out_of_range_end. can check if it's inside valid range or not.

it's ok check if iterator bigger or equal (>=) iterator returned begin().

when check if __it past last element should evaluate if iterator not equal tokens.end()

e.g. should check like

return (__it >= __tokens.begin()      && __it != __tokens.end()) ? *__it : syntax::out_of_range; 

this requires not increment iterator past containers past-the-end-iterator. accessing memory pointed iterator has been incremented past end()-iterator result in undefined behaviour.


Comments

Popular posts from this blog

How to mention the localhost in android -

php - Calling a template part from a post -

c# - String.format() DateTime With Arabic culture -