std::list

Y

Youssef Mesri

How can I erase one element over two in a list container?
I have done something like this:

1-
list<double> X;
list<double>::iterator iter;
for (int k=0; k<X.size() ; k++)
{
++iter;
if (!(k%2)) { X.pop_back(); }

}

2- I would like using something like this
for (iter=X.begin(); iter!=X.begin() ; iter++)
{

if (!(k%2)) { X.erase(iter); }

}


but doesn't work!

any suggustions?
thank you in advance
 
M

ma740988

Example:

int main()
{
std::list<int> the_list;
the_list.push_back(1);
the_list.push_back(-15);
the_list.push_back(3);
the_list.push_back(20);

std::list<int>::iterator pos;

for(pos = the_list.begin(); pos != the_list.end(); )
if(*pos < -10 || *pos > 10)
pos = the_list.erase(pos);
else
++pos;

std::copy(the_list.begin(), the_list.end(),
std::eek:stream_iterator<int>(std::cout, "\n"));

}
 
M

ma740988

Example:

int main()
{
std::list<int> the_list;
the_list.push_back(1);
the_list.push_back(-15);
the_list.push_back(3);
the_list.push_back(20);

std::list<int>::iterator pos;

for(pos = the_list.begin(); pos != the_list.end(); )
if(*pos < -10 || *pos > 10)
pos = the_list.erase(pos);
else
++pos;

std::copy(the_list.begin(), the_list.end(),
std::eek:stream_iterator<int>(std::cout, "\n"));

}
 
M

ma740988

Example:

int main()
{
std::list<int> the_list;
the_list.push_back(1);
the_list.push_back(-15);
the_list.push_back(3);
the_list.push_back(20);

std::list<int>::iterator pos;

for(pos = the_list.begin(); pos != the_list.end(); )
if(*pos < -10 || *pos > 10)
pos = the_list.erase(pos);
else
++pos;

std::copy(the_list.begin(), the_list.end(),
std::eek:stream_iterator<int>(std::cout, "\n"));

}
 
D

dukguru

in 2 situation,

int k = 0;

for (iter=X.begin(); iter!=X.begin() ; iter++)
{
if (!(k++%2))
{
itr = X.erase(iter);
itr--;
}
}
 
M

Maxim Yegorushkin

Youssef said:
How can I erase one element over two in a list container?
I have done something like this:
[]

2- I would like using something like this
for (iter=X.begin(); iter!=X.begin() ; iter++)
{

if (!(k%2)) { X.erase(iter); }

}

Upon return from erase() iter is invalidated, you can't use it any
more. Fix:

for (iter = X.begin(); iter != X.end();)
{
if(some_condition)
x.erase(iter++);
else
++iter;
}
 
G

Greg

Youssef said:
How can I erase one element over two in a list container?
I have done something like this:

1-
list<double> X;
list<double>::iterator iter;
for (int k=0; k<X.size() ; k++)
{
++iter;
if (!(k%2)) { X.pop_back(); }

}

2- I would like using something like this
for (iter=X.begin(); iter!=X.begin() ; iter++)
{

if (!(k%2)) { X.erase(iter); }

}


but doesn't work!

Don't write a loop when one is not needed:

#include <list>

inline
bool IsEven(int n)
{
return not (n bitand 0x01);
}

int main (void)
{
std::list<int> theList;

// add some numbers to the list
theList.push_back(1);
theList.push_back(-8);
theList.push_back(-15);
theList.push_back(3);
theList.push_back(20);

// now remove every even number
theList.remove_if(IsEven);
...

Greg
 
G

Greg

Youssef said:
How can I erase one element over two in a list container?
I have done something like this:

1-
list<double> X;
list<double>::iterator iter;
for (int k=0; k<X.size() ; k++)
{
++iter;
if (!(k%2)) { X.pop_back(); }

}

2- I would like using something like this
for (iter=X.begin(); iter!=X.begin() ; iter++)
{

if (!(k%2)) { X.erase(iter); }

}


but doesn't work!

Don't write a loop when one is not needed:

#include <list>

inline
bool IsEven(int n)
{
return not (n bitand 0x01);
}

int main()
{
std::list<int> theList;

// add some numbers to the list
theList.push_back(1);
theList.push_back(-8);
theList.push_back(-15);
theList.push_back(3);
theList.push_back(20);

// now remove every even number
theList.remove_if(IsEven);
...

Greg
 
D

Diego Martins

In your example, IsEven will receive the element value, not the element
pos.

try this:

struct IsEven {
IsEven(): pos(0) {}
bool operator()(int) {
return not (pos++ & 1);
}
private:
int pos;
};

....

theList.remove_if(IsEven(0));
 
E

Earl Purple

Diego said:
In your example, IsEven will receive the element value, not the element
pos.

try this:

struct IsEven {
IsEven(): pos(0) {}
bool operator()(int) {
return not (pos++ & 1);
}
private:
int pos;
};

...

theList.remove_if(IsEven(0));

IsEven is a misnomer. You'd really want a toggler.

class Toggler
{
bool flag;
public:
explicit Toggler( bool init=false ) : flag( init )
{
}

template < typename T >
bool operator() ( const T& )
{
return ( flag ^= true );
}
};

myList.remove_if( Toggler() );
 

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

Forum statistics

Threads
473,811
Messages
2,569,693
Members
45,477
Latest member
IsidroSeli

Latest Threads

Top