STL的find_if用法(包含嵌套类)

在前人的程式碼中挖出一段有趣的find_if應用,我把它改寫成比較好理解的樣式。
例子:一個班級裡有n個學生,現在我們要利用他們的學號來找尋此人。

解析:假設學生是用容器存起來的,我們當然可以直接寫出在容器內收尋id然後再show出來就可以了,不過既然要用find_if,那麼上面的方法自然也就不使用啦。

 首先我們先定義學生的資料,這裡我只加個id而已:
 

01class CStudent
02{
03public:
04    CStudent(int id) : m_id(id) {}
05    ~CStudent() {}
06  
07    int GetID() { return this->m_id; }
08    void Show() { std::cout << this->m_id << std::endl; }
09  
10private:
11    int m_id;
12};

然後再來定義班級的資料,這裡把FindID放進來是因為我不想讓其他人去使用到它,只限用此class可使用:

01class CClass
02{
03public:
04    CClass() {}
05    ~CClass() {}
06  
07    void Add(CStudent student) { m_students.push_back(student); }
08    void ShowAll();
09  
10    // 再從這邊再延伸出FindFromName...blablabla
11    void FindFromID(int id);
12private:
13    std::vector<CStudent> m_students;
14  
15private:
16    // 由此可延伸出FindName_.....blabla
17    class FindID
18    {
19    public:
20        FindID(const int compare_id) : m_compare_id(compare_id) {}
21        ~FindID() {}
22  
23        bool operator() (CStudent student) { return student.GetID() == this->m_compare_id; }
24  
25    private:
26        int m_compare_id;
27    };
28};

再來定義CClass裡的Function:

01void CClass::ShowAll()
02{
03    for (std::vector<CStudent>::iterator it = this->m_students.begin(); it != this->m_students.end(); ++it)
04        std::cout << it->GetID() << std::endl;
05}
06  
07void CClass::FindFromID(int id)
08{
09    // 要注意當取出m_students裡的ptr時,型態要跟FindID重載()裡的型態一致
10    std::vector<CStudent>::iterator it = std::find_if(this->m_students.begin(), this->m_students.end(), CClass::FindID(id));
11    if (it == this->m_students.end())
12        std::cout << "Sorry!No find!" << std::endl;
13    else
14        std::cout << "Find student ID : " << it->GetID() << std::endl;
15}

要怎麼使用呢?

1CClass class01;
2for (int i = 1; i <= 50; ++i)
3    class01.Add(CStudent(i));
4  
5class01.ShowAll();
6class01.FindFromID(24);

转载于:https://www.cnblogs.com/zhangjing0502/archive/2012/06/01/2531161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值