从list 队列中删除指定的元素, remove_if函数该如何用
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
从list 队列中删除指定的元素, remove_if函数该如何用
#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(...)
括号里该如何写哪?
#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(...)
括号里该如何写哪?
-
- 帖子: 3
- 注册时间: 2008-10-15 17:38
Re: 从list 队列中删除指定的元素, remove_if函数该如何用
楼主需要的大概是
函数对象
函数对象
- BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
- 联系:
Re: 从list 队列中删除指定的元素, remove_if函数该如何用
remove_if 不删除元素
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: 从list 队列中删除指定的元素, remove_if函数该如何用
BigSnake.NET,
大蛇的意思是说我还得一个一个判断了
但是我的compare函数确实是删除了对象
这又如何解释
大蛇的意思是说我还得一个一个判断了
但是我的compare函数确实是删除了对象
这又如何解释
- anticlockwise
- 帖子: 2394
- 注册时间: 2007-03-01 20:46
- 来自: 湖南长沙
Re: 从list 队列中删除指定的元素, remove_if函数该如何用
有两种方法:
1. Hard code:直接在Compare函数中写入 return ((3 == nNum) || (4 == nNum) || (5 == nNum))
2. 利用Closure,但由于我对C和C++不是那么了解,我只知道两者都可以实现closure(利用函数指针),只是具体如何实现,就得靠LZ自己查资料了~~
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函数该如何用
代码: 全选
#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;
}
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: 从list 队列中删除指定的元素, remove_if函数该如何用
应该是这个意思
实际上是想实现这个功能
但是我的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’不能出现在常量表达式中
..................
}
编译的时候报错,有解吗???
实际上是想实现这个功能
但是我的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函数该如何用
问题很多,首先你比较的是指针,本身就有问题。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函数该如何用
代码: 全选
#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;
}
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: 从list 队列中删除指定的元素, remove_if函数该如何用
要是这样的话,我从队列中删除指定的元素只能一个一个对比,找到了就删除了
-
- 帖子: 2841
- 注册时间: 2006-09-11 22:47
Re: 从list 队列中删除指定的元素, remove_if函数该如何用
建议楼主看看有关 functor (函数对象)的内容,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(...)
括号里该如何写哪?
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函数该如何用
写一个CLASS,用标准库的算法:remove_if(),在定义一个谓词函数,在<functional>里,标准库提供的常用的谓词,比如:equal_to。