list::end() decrement

J

JC

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 able to find was at http://www.sgi.com/tech/stl/BackInsertionSequence.html, which is trustworthy, but I wasn't able to find the validity explicitly stated anywhere (not that it isn't, I just couldn't find it).

Thanks!
J
 
M

Marc

JC said:
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?

It may not even compile. On the other hand, the following is fine:

list<x>::iterator lastiter = alist.end();
-- lastiter;
 
S

Saeed Amrollahi

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&lt;x&gt; alist = ...; // non-empty
list&lt;x&gt;::iterator lastiter = -- alist.end();

... always result in lastiter being a valid forward iterator for the lastelement in alist?

The reason I'm asking is because the only reference I was able to find was at http://www.sgi.com/tech/stl/BackInsertionSequence.html, which is trustworthy, but I wasn't able to find the validity explicitly stated anywhere (not that it isn't, I just couldn't find 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';

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
 
J

JC

:end()? In particular, assuming a non-empty, non-volatile list, will...
&gt;
&gt; list&amp;lt;x&amp;gt; alist = ...; // non-empty
&gt; list&amp;lt;x&amp;gt;::iterator lastiter = -- alist.end();
&gt;
&gt; ... always result in lastiter being a valid forward iterator for thelast element in alist?
&gt;
&gt; The reason I&amp;#39;m asking is because the only reference I was able to find was at http://www.sgi.com/tech/stl/BackInsertionSequence.html, which is trustworthy, but I wasn&amp;#39;t able to find the validity explicitly stated anywhere (not that it isn&amp;#39;t, I just couldn&amp;#39;t find it).
&gt;
&gt; Thanks!
&gt; 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 &lt;list&gt;
#include &lt;iostream&gt;

int main()
{
using namespace std;
list&lt;int&gt; a_list = {0, 1, 2};
list&lt;int&gt;::iterator last_iter = --a_list.end();
cout &lt;&lt; *last_iter &lt;&lt; '\n';

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 &lt;list&gt;
#include &lt;iostream&gt;

int main()
{
using namespace std;
list&lt;int&gt; a_list;
a_list.push_back(0); a_list.push_back(1); a_list.push_back(2);
list&lt;int&gt;::iterator last_iter = --a_list.end();
cout &lt;&lt; *last_iter &lt;&lt; '\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/BackInsertionSequence.html says:

"a.back() | Equivalent to *(--a.end())."

But I wasn't able to determine if the note was a conceptual or formal example.

It is working in my code for now, at least, not that that means anything...

J
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top