当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-22 11:21 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
#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(...)
括号里该如何写哪?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-22 12:48 

注册: 2008-10-15 17:38
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
楼主需要的大概是
函数对象


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-22 12:54 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
remove_if 不删除元素


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-22 20:44 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
BigSnake.NET,
大蛇的意思是说我还得一个一个判断了
但是我的compare函数确实是删除了对象
这又如何解释


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-23 0:15 
头像

注册: 2007-03-01 20:46
帖子: 2393
地址: 湖南长沙
送出感谢: 0 次
接收感谢: 0 次
有两种方法:

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


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-23 1:28 
头像

注册: 2006-05-20 14:03
帖子: 898
送出感谢: 0 次
接收感谢: 0 次
代码:
#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;

}

楼主是这个意思么


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-23 13:28 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
应该是这个意思
实际上是想实现这个功能
但是我的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’不能出现在常量表达式中

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

编译的时候报错,有解吗???


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-23 14:05 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
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’不能出现在常量表达式中

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

编译的时候报错,有解吗???


问题很多,首先你比较的是指针,本身就有问题。
模板参数必须是编译期常量


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-23 14:13 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
代码:
#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;
}


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-23 14:44 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
要是这样的话,我从队列中删除指定的元素只能一个一个对比,找到了就删除了


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-23 21:17 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
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))


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 从list 队列中删除指定的元素, remove_if函数该如何用
帖子发表于 : 2009-06-24 0:09 
头像

注册: 2009-05-30 15:52
帖子: 46
地址: DL LIAONING CHN
送出感谢: 0 次
接收感谢: 0 次
写一个CLASS,用标准库的算法:remove_if(),在定义一个谓词函数,在<functional>里,标准库提供的常用的谓词,比如:equal_to。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 12 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译