从list 队列中删除指定的元素, remove_if函数该如何用

软件和网站开发以及相关技术探讨
回复
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

从list 队列中删除指定的元素, remove_if函数该如何用

#1

帖子 weihua2008 » 2009-06-22 11:21

#include<iostream>
#include<list>
#include<string.h>
using namespace std;
list<int> list1;

bool Compare(int & nNum)
{
return (3 == nNum );
}
int main()
{
list1.push_back(2);
list1.push_back(3);
list1.push_back(4);
list1.push_back(5);
list1.push_back(6);
list1.push_back(7);
list1.push_back(8);
list1.push_back(9);

list1.remove_if(Compare);
list<int>::iterator iter;

for(iter=list1.begin();iter != list1.end();iter++)
cout<<*iter<<endl;

return 0;

}

可以删除3但是我想删除4,5。。。
时我如何修改函数Compare或者直接
list1.remove_if(...)
括号里该如何写哪?
rechardchen
帖子: 3
注册时间: 2008-10-15 17:38

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#2

帖子 rechardchen » 2009-06-22 12:48

楼主需要的大概是
函数对象
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#3

帖子 BigSnake.NET » 2009-06-22 12:54

remove_if 不删除元素
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#4

帖子 weihua2008 » 2009-06-22 20:44

BigSnake.NET,
大蛇的意思是说我还得一个一个判断了
但是我的compare函数确实是删除了对象
这又如何解释
头像
anticlockwise
帖子: 2394
注册时间: 2007-03-01 20:46
来自: 湖南长沙

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#5

帖子 anticlockwise » 2009-06-23 0:15

有两种方法:

1. Hard code:直接在Compare函数中写入 return ((3 == nNum) || (4 == nNum) || (5 == nNum))
2. 利用Closure,但由于我对C和C++不是那么了解,我只知道两者都可以实现closure(利用函数指针),只是具体如何实现,就得靠LZ自己查资料了~~
头像
peachcolor
帖子: 898
注册时间: 2006-05-20 14:03

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#6

帖子 peachcolor » 2009-06-23 1:28

代码: 全选

#include<iostream>
#include<list>
#include<string.h>
using namespace std;
list<int> list1;

template<int t> bool Compare(int & nNum)
{
return (t == nNum );
}
int main()
{
list1.push_back(2);
list1.push_back(3);
list1.push_back(4);
list1.push_back(5);
list1.push_back(6);
list1.push_back(7);
list1.push_back(8);
list1.push_back(9);

list1.remove_if(Compare<3>);
list1.remove_if(Compare<4>);
list<int>::iterator iter;

for(iter=list1.begin();iter != list1.end();iter++)
cout<<*iter<<endl;

return 0;

}
楼主是这个意思么
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#7

帖子 weihua2008 » 2009-06-23 13:28

应该是这个意思
实际上是想实现这个功能
但是我的list装的不是int,而是机构体指针
struct CTest
{
int n;
char a;
};
list<CTest *> list1;

template<CTest * t> bool Compare(CTest * & nNum)
{
return (t == nNum );
}
int main()
{
CTest *ct1 = new CTest();
ct1->n = 1;
ct1->a = 'a';
CTest *ct2 = new CTest();
ct2->n = 2;
ct2->a = 'b';
CTest *ct3 = new CTest();
ct3->n = 3;
ct3->a = 'c';
CTest *ct4 = new CTest();
ct4->n = 4;
ct4->a = 'd';
CTest *ct5 = new CTest();
ct5->n = 5;
ct5->a = 'e';
CTest *ct6 = new CTest();
ct6->n = 6;
ct6->a = 'f';
CTest *ct7 = new CTest();
ct7->n = 7;
ct7->a = 'g';
CTest *ct8 = new CTest();
ct8->n = 8;
ct8->a = 'h';

list1.push_back(ct1);
list1.push_back(ct2);
list1.push_back(ct3);
list1.push_back(ct4);
list1.push_back(ct5);
list1.push_back(ct6);
list1.push_back(ct7);
list1.push_back(ct8);

list1.remove_if(Compare<ct3>);//ct3’不能出现在常量表达式中
list1.remove_if(Compare<ct4>);ct4’不能出现在常量表达式中

..................

编译的时候报错,有解吗???
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#8

帖子 BigSnake.NET » 2009-06-23 14:05

weihua2008 写了:应该是这个意思
实际上是想实现这个功能
但是我的list装的不是int,而是机构体指针
struct CTest
{
int n;
char a;
};
list<CTest *> list1;

template<CTest * t> bool Compare(CTest * & nNum)
{
return (t == nNum );
}
int main()
{
CTest *ct1 = new CTest();
ct1->n = 1;
ct1->a = 'a';
CTest *ct2 = new CTest();
ct2->n = 2;
ct2->a = 'b';
CTest *ct3 = new CTest();
ct3->n = 3;
ct3->a = 'c';
CTest *ct4 = new CTest();
ct4->n = 4;
ct4->a = 'd';
CTest *ct5 = new CTest();
ct5->n = 5;
ct5->a = 'e';
CTest *ct6 = new CTest();
ct6->n = 6;
ct6->a = 'f';
CTest *ct7 = new CTest();
ct7->n = 7;
ct7->a = 'g';
CTest *ct8 = new CTest();
ct8->n = 8;
ct8->a = 'h';

list1.push_back(ct1);
list1.push_back(ct2);
list1.push_back(ct3);
list1.push_back(ct4);
list1.push_back(ct5);
list1.push_back(ct6);
list1.push_back(ct7);
list1.push_back(ct8);

list1.remove_if(Compare<ct3>);//ct3’不能出现在常量表达式中
list1.remove_if(Compare<ct4>);ct4’不能出现在常量表达式中

..................

编译的时候报错,有解吗???
问题很多,首先你比较的是指针,本身就有问题。
模板参数必须是编译期常量
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#9

帖子 BigSnake.NET » 2009-06-23 14:13

代码: 全选

#include<iostream>
#include<list>
#include<string>

using namespace std;

class cmp_foo {
    private:
        int x_;
    public:
        cmp_foo (int x)
            :x_(x) {}
        bool operator() (int x) {
            return x == x_;
        }
};

int main()
{
    list<int> list_foo;
    list_foo.push_back(2);
    list_foo.push_back(3);
    list_foo.push_back(4);
    list_foo.push_back(5);
    list_foo.push_back(6);
    list_foo.push_back(7);
    list_foo.push_back(8);
    list_foo.push_back(9);


    list_foo.remove_if(cmp_foo(3));
    list_foo.remove_if(cmp_foo(4));

    for (list<int>::iterator i = list_foo.begin();
            i != list_foo.end();
            ++i )
        cout << (* i) << endl;
    return 0;
}
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#10

帖子 weihua2008 » 2009-06-23 14:44

要是这样的话,我从队列中删除指定的元素只能一个一个对比,找到了就删除了
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#11

帖子 poet » 2009-06-23 21:17

weihua2008 写了:#include<iostream>
#include<list>
#include<string.h>
using namespace std;
list<int> list1;

bool Compare(int & nNum)
{
return (3 == nNum );
}

可以删除3但是我想删除4,5。。。
时我如何修改函数Compare或者直接
list1.remove_if(...)
括号里该如何写哪?
建议楼主看看有关 functor (函数对象)的内容,
C++作者在C++编程第二版里面写得非常详细了。

这里给你一段简单例子,不过你必须看懂 functor 才能看懂。

class Compare
{
public:
Compare(int anum) : mnum(anum) {}
private:
bool operator()(int anum) { return anum == mnum; }
int mnum;
}

list1.remove_if(Compare(3))
头像
xiaocheng_zh
帖子: 46
注册时间: 2009-05-30 15:52
来自: DL LIAONING CHN

Re: 从list 队列中删除指定的元素, remove_if函数该如何用

#12

帖子 xiaocheng_zh » 2009-06-24 0:09

写一个CLASS,用标准库的算法:remove_if(),在定义一个谓词函数,在<functional>里,标准库提供的常用的谓词,比如:equal_to。
回复