Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   list::end() decrement (http://www.velocityreviews.com/forums/t948382-list-end-decrement.html)

JC 07-22-2012 05:54 AM

list::end() decrement
 
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

Marc 07-22-2012 09:21 AM

Re: list::end() decrement
 
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?


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

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

Saeed Amrollahi 07-22-2012 11:07 AM

Re: list::end() decrement
 
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&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&#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&#39;t able to find the validity explicitly stated anywhere (not that it isn&#39;t, I just couldn&#39;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

JC 07-24-2012 03:31 PM

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:
> &gt; Just to make sure, is the pre/post decrement operator valid on list::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&#39;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&#39;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; &#39;\n&#39;;
>
> 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; &#39;\n&#39;;
>
> 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


All times are GMT. The time now is 03:53 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.