Re: list::end() decrement
On Sunday, July 22, 2012 7:07:40 AM UTC-4, Saeed Amrollahi wrote:
On Sunday, July 22, 2012 10:24:58 AM UTC+4:30, JC wrote:
> Just to make sure, is the pre/post decrement operator valid on list:=
:end()? In particular, assuming a non-empty, non-volatile list, will...
>
> list<x> alist = ...; // non-empty
> list<x>::iterator lastiter = -- alist.end();
>
> ... always result in lastiter being a valid forward iterator for the=
last element in alist?
>
> The reason I'm asking is because the only reference I was ab=
le to find was at http://www.sgi.com/tech/stl/BackInsertionSequence.html, w=
hich is trustworthy, but I wasn't able to find the validity explici=
tly stated anywhere (not that it isn't, I just couldn't fin=
d it).
>
> Thanks!
> J
Hi
I reviewed the C++ final draft international standard (N3290), quickly,
but I didn't find anything specific about end() iterator decrement.
BTW, I compiled and ran the following program under GCC 4.7.0
in two cases: list is empty and list isn't empty. It was fine:
#include <list>
#include <iostream>
int main()
{
using namespace std;
list<int> a_list = {0, 1, 2};
list<int>::iterator last_iter = --a_list.end();
cout << *last_iter << '\n';=09
return 0;
}
I use the following command:
$ g++ -pedantic -pedantic-errors -std=c++11 list_end_iter.c++
$ ./a.out
2
If the list is empty, 0 is the output.
Also, I compiled and ran the following program under Visual Studio 2008:
#include <list>
#include <iostream>
int main()
{
using namespace std;
list<int> a_list;
a_list.push_back(0); a_list.push_back(1); a_list.push_back(2);
list<int>::iterator last_iter = --a_list.end();
cout << *last_iter << '\n';
return 0;
}
It was OK, and the output is 2, but if the list is empty,
there is run-time exception with the following message:
list iterator not decrement-able.
HTH,
-- Saeed Amrollahi Boyouki
Thanks for digging into it! Yes it is hard to find solid information.
The original page I linked to at http://www.sgi.com/tech/stl/BackInsertionS=
equence.html says:
"a.back() | Equivalent to *(--a.end())."
But I wasn't able to determine if the note was a conceptual or formal examp=
le.
It is working in my code for now, at least, not that that means anything...
J