Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Deleting from std::list

Reply
Thread Tools

Deleting from std::list

 
 
Martin Magnusson
Guest
Posts: n/a
 
      08-21-2003
I know a similar question was recently posted here, but after trying the
solutions in that thread I still have problems.

list<int> the_list;
the_list.push_back(1);
the_list.push_back(2);
the_list.push_back(3);
the_list.push_back(4);
list<int>::iterator i = the_list.end();
i--;
cout << the_list.size();
for (std::list<int>::iterator j = i;
j != the_list.end();
++j)
{
cout << ".";
j = the_list.erase( j );
}
cout << the_list.size();

What happens is this: j goes to the end of the list and erases the last
element. By then I would have thought that j would be set to nodes.end()
and the loop would terminate, but instead it seems that the loop keeps
running, erasing all of the list. The output of the above code is
"4....0". What am I doing wrong?

 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      08-22-2003
"Martin Magnusson" <(E-Mail Removed)> wrote...
> I know a similar question was recently posted here, but after trying the
> solutions in that thread I still have problems.
>
> list<int> the_list;
> the_list.push_back(1);
> the_list.push_back(2);
> the_list.push_back(3);
> the_list.push_back(4);
> list<int>::iterator i = the_list.end();
> i--;
> cout << the_list.size();
> for (std::list<int>::iterator j = i;
> j != the_list.end();
> ++j)


What's the purpose of ++j here?

> {
> cout << ".";
> j = the_list.erase( j );
> }
> cout << the_list.size();
>
> What happens is this: j goes to the end of the list and erases the last
> element. By then I would have thought that j would be set to nodes.end()
> and the loop would terminate, but instead it seems that the loop keeps
> running, erasing all of the list. The output of the above code is
> "4....0". What am I doing wrong?


Why are you increasing 'j'? Once 'j' is set to the_list.end(),
using ++ for it causes undefined behaviour. If an iterator is
"one past the end", it is not dereferenceable, which is a pre-
condition for ++.

Victor


 
Reply With Quote
 
 
 
 
Mike Wahler
Guest
Posts: n/a
 
      08-22-2003
Martin Magnusson <(E-Mail Removed)> wrote in message
news:bi3l02$fe7$(E-Mail Removed)...
> I know a similar question was recently posted here, but after trying the
> solutions in that thread I still have problems.
>
> list<int> the_list;
> the_list.push_back(1);
> the_list.push_back(2);
> the_list.push_back(3);
> the_list.push_back(4);
> list<int>::iterator i = the_list.end();
> i--;
> cout << the_list.size();
> for (std::list<int>::iterator j = i;


So now 'j' points to the last element (with value of 4.)

> j != the_list.end();
> ++j)
> {
> cout << ".";
> j = the_list.erase( j );


Now 'j' == the_list.end()
We go back to the top of the loop, where 'j' is incremented.
(past end()). Heaven knows what the 'value' of 'j' is now,
but it's not equal to 'end()'. So the body of the loop
executes again.

I think we have undefined behavior here.


> }
> cout << the_list.size();
>
> What happens is this: j goes to the end of the list and erases the last
> element. By then I would have thought that j would be set to nodes.end()
> and the loop would terminate, but instead it seems that the loop keeps
> running, erasing all of the list. The output of the above code is
> "4....0". What am I doing wrong?



Try:

for (std::list<int>::iterator j = i;
j != the_list.end();
j = the_list.erase(j))
{
cout << ".";
}

or

for (std::list<int>::iterator j = i;
j != the_list.end();
/* no iteration expression */ )
{
cout << ".";
j = the_list.erase(j);
}

Your '++j' was overwriting the return from erase that
you stored in 'j'.

I must admit it did take me a few minutes to realize
what was going on.

HTH,
-Mike



 
Reply With Quote
 
John Harrison
Guest
Posts: n/a
 
      08-22-2003

"Martin Magnusson" <(E-Mail Removed)> wrote in message
news:bi3l02$fe7$(E-Mail Removed)...
> I know a similar question was recently posted here, but after trying the
> solutions in that thread I still have problems.
>
> list<int> the_list;
> the_list.push_back(1);
> the_list.push_back(2);
> the_list.push_back(3);
> the_list.push_back(4);
> list<int>::iterator i = the_list.end();
> i--;
> cout << the_list.size();
> for (std::list<int>::iterator j = i;
> j != the_list.end();
> ++j)
> {
> cout << ".";
> j = the_list.erase( j );
> }
> cout << the_list.size();
>
> What happens is this: j goes to the end of the list and erases the last
> element. By then I would have thought that j would be set to nodes.end()
> and the loop would terminate, but instead it seems that the loop keeps
> running, erasing all of the list. The output of the above code is
> "4....0". What am I doing wrong?
>


But that isn't the solution that was posted recently. If you really tried
the solution posted recently you would have more luck.

Your problem is that j is set to nodes.end(), but what is the next thing you
do? ++j of course!

This is the correct solution.

for (std::list<int>::iterator j = i;
j != the_list.end();
)
{
cout << ".";
j = the_list.erase( j );
}

Note that ++j has disappeared.

john


 
Reply With Quote
 
Martin Magnusson
Guest
Posts: n/a
 
      08-22-2003
Thanks for your answers, all of you! I wasn't aware that the ++j was
executed before the comparison j!=the_list.end().


 
Reply With Quote
 
Stuart Golodetz
Guest
Posts: n/a
 
      08-22-2003
"Martin Magnusson" <(E-Mail Removed)> wrote in message
news:bi59l9$jac$(E-Mail Removed)...
> Thanks for your answers, all of you! I wasn't aware that the ++j was
> executed before the comparison j!=the_list.end().


A couple more things:

1)

If you really just want to remove the last element of a list, you're better
off just writing:

the_list.pop_back();

2)

Regarding for loops, if you have something like this:

for(int i=0; i<3; ++i)
{
std::cout << i << ' ';
}

What actually happens is something like this (using an "infinite" while
loop, to make things clear):

int i = 0;
while(1)
{
if(!(i < 3)) break;
std::cout << i << ' ';
++i;
}

Hope that clarifies things a bit?

Cheers,

Stuart.


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Deleting data from the file without deleting the file first crea C++ 2 12-28-2012 11:50 PM
Deleting a File from Hardrive and Deleting a SubKey in Registry Harry Barker C++ 2 04-19-2006 09:34 AM
Deleting a wireless network =?Utf-8?B?TGlubmVjb3I=?= Wireless Networking 3 11-06-2005 05:59 PM
Deleting awireless network connection =?Utf-8?B?SGF3a2V5ZTA3Ng==?= Wireless Networking 0 10-23-2005 12:25 AM
Deleting old Network ? =?Utf-8?B?Q2Fyb2xlIFVL?= Wireless Networking 3 10-05-2005 07:45 PM



Advertisments