Does the following give defined results in terms of the C++ standard?
std::list<int> myList; std::list<int>::iterator myIter = myList.begin(); // any issues? myList.push_back( 123 ); myIter++; // will myIter point to the 123 I pushed?
I can test this out on the compiler I'm using... but I'd like a more definitive answer.
std::list::sort. Sorts the elements in ascending order. The order of equal elements is preserved.
std::list is a container that supports constant time insertion and removal of elements from anywhere in the container. Fast random access is not supported. It is usually implemented as a doubly-linked list.
In C++, the std::list refers to a storage container. The std:list allows you to insert and remove items from anywhere. The std::list is implemented as a doubly-linked list. This means list data can be accessed bi-directionally and sequentially.
Consider using std::list if: You need to store many items but the number is unknown. You need to insert or remove new elements from any position in the sequence. You do not need efficient access to random elements.
All standard iterator and container types behave the same in this regard:
§23.2.1 [container.requirements.general] p6
begin()
returns an iterator referring to the first element in the container.end()
returns an iterator which is the past-the-end value for the container. If the container is empty, thenbegin() == end()
;
And table 107 in §24.2.3 [input.iterators]
demands that as a precondition for ++it
, it
shall be dereferenceable, which is not the case for past-the-end iterators (i.e., what you get from end()
), as such you're treading into the dreaded domain of undefined behaviour.
std::list<int> myList; std::list<int> myIter = myList.begin();
The iterator has the same value as if you were initializing it with myList.end()
. The iterator is initialized to on-past-the-end position. Even after you push an element into the list the iterator still points one-past-the-end. If you increment it, you are invoking undefined behaviour.
UPDATE:
E.g., if you compile your snippet with GCC with -D_GLIBCXX_DEBUG, the resulting executable will abort:
/usr/include/c++/4.6/debug/safe_iterator.h:236:error: attempt to increment a past-the-end iterator. Objects involved in the operation: iterator "this" @ 0x0x7fffc9548fb0 { type = N11__gnu_debug14_Safe_iteratorINSt9__cxx199814_List_iteratorIiEENSt7__debug4listIiSaIiEEEEE (mutable iterator); state = past-the-end; references sequence with type `NSt7__debug4listIiSaIiEEE' @ 0x0x7fffc9548fb0 } zsh: abort (core dumped) ./listiter
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With