题目够长的....
其实有时.要小用list来作一些过滤..我知道list的随机查找不太好...可是有时写好了,,性能上也没有太多要求..就....
所以我就直接remove_if...
http://www.cplusplus.com/reference/stl/list/remove_if/
找了个示例
代码如下
// list::remove_if #include <iostream> #include <list> using namespace std; // a predicate implemented as a function: bool single_digit (const int& value) { return (value<10); } // a predicate implemented as a class: class is_odd { public: bool operator() (const int& value) {return (value%2)==1; } }; int main () { int myints[]= {15,36,7,17,20,39,4,1}; list<int> mylist (myints,myints+8); // 15 36 7 17 20 39 4 1 mylist.remove_if (single_digit); // 15 36 17 20 39 mylist.remove_if (is_odd()); // 36 20 cout << "mylist contains:"; for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it) cout << " " << *it; cout << endl; return 0; }
但发现所接的有时需要在 remove_if所接的 函数中加入传入参数等....
好像直接用函数会出错.
但观察得.
// a predicate implemented as a class: class is_odd { public: bool operator() (const int& value) {return (value%2)==1; } }; 所以就直接自己再加了一个测试...
class less_than { public: less_than(int mid):_mid(mid){}; bool operator()(const int& value) {return value < _mid;} int _mid; };
在调用的main中加入
int main () { int myints[]= {15,36,7,17,20,39,4,1}; list<int> mylist (myints,myints+8); // 15 36 7 17 20 39 4 1 mylist.remove_if (single_digit); // 15 36 17 20 39 mylist.remove_if (is_odd()); // 36 20 //invoke here begin mylist.remove_if(less_than(30)); //36 //invoke here end cout << "mylist contains:"; for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it) cout << " " << *it; cout << endl; return 0; }
但这里list所放的是int这种基本元素..我试着放入自定义的数据类型的时候就出问题了
如加入这个数据类型
class Cmd { public: Cmd(string name):_name(name){}; string GetName(){return _name;} string _name; };
在main中加入
Cmd* c1 = new Cmd("c1"); Cmd* c2 = new Cmd("c2"); list<Cmd*> cmd_list; cmd_list.push_back(c1); cmd_list.push_back(c2); cout << "size = [" << cmd_list.size() <<endl; string str = "c1"; cmd_list.remove_if(lt2(str)); //compile err this line cout << "size = [" << cmd_list.size() <<endl; delete c1; delete c2;
其中lt2的定义如下
class lt2 { public: lt2(string name) :_name(name){}; bool operator()( const Cmd*& cmd) { return cmd->GetName() == _name; } private: string _name; };
后来参考了
http://blog.csdn.net/lonelysky/article/details/6584303
这篇文章,发现如果非基楚数据类型要继承某个类..
所以改成了
class lt2 : public unary_function<Cmd*, bool> { public: lt2(string name) :_name(name){}; // bool operator()(const Cmd*& cmd) bool operator()( Cmd*& cmd) const { return cmd->GetName() == _name; } private: string _name; };
就可以了.....
看来有时遇到STL报的错真的要折腾半天啊.....