例子:一個班級裡有n個學生,現在我們要利用他們的學 號來找尋此人。
解析:假設學生是用容器存起來的,我們當然可以直接寫出在容器內收尋id然後再show出來就可以了,不過既然要用 find_if,那麼上面的方法自然也就不使用啦。
首先我們先定義學生的資料,這裡我只加個id而已:
class CStudent
{
public:
CStudent(int id) : m_id(id) {}
~CStudent() {}
int GetID() { return this->m_id; }
void Show() { std::cout << this->m_id << std::endl; }
private:
int m_id;
};然後再來定義班級的資料,這裡把FindID放進來是因為我不想讓其他人去使用到它,只限用此class可使用:class CClass
{
public:
CClass() {}
~CClass() {}
void Add(CStudent student) { m_students.push_back(student); }
void ShowAll();
// 再從這邊再延伸出FindFromName...blablabla
void FindFromID(int id);
private:
std::vector<CStudent> m_students;
private:
// 由此可延伸出FindName_.....blabla
class FindID
{
public:
FindID(const int compare_id) : m_compare_id(compare_id) {}
~FindID() {}
bool operator() (CStudent student) { return student.GetID() == this->m_compare_id; }
private:
int m_compare_id;
};
};再來定義CClass裡的Function:void CClass::ShowAll()
{
for (std::vector<CStudent>::iterator it = this->m_students.begin(); it != this->m_students.end(); ++it)
std::cout << it->GetID() << std::endl;
}
void CClass::FindFromID(int id)
{
// 要注意當取出m_students裡的ptr時,型態要跟FindID重載()裡的型態一致
std::vector<CStudent>::iterator it = std::find_if(this->m_students.begin(), this->m_students.end(), CClass::FindID(id));
if (it == this->m_students.end())
std::cout << "Sorry!No find!" << std::endl;
else
std::cout << "Find student ID : " << it->GetID() << std::endl;
}要怎麼使用呢?CClass class01; for (int i = 1; i <= 50; ++i) class01.Add(CStudent(i)); class01.ShowAll(); class01.FindFromID(24);嗯....其實是有點麻煩啦..XD,不過感覺起來比較有OO的fu。仔細去研究一下find_if的寫法,倒是了解要傳什麼東西進去了。
// TEMPLATE FUNCTION find_if
template<class _InIt,
class _Pr> inline
_InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{ // find first satisfying _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Pred);
for (; _First != _Last; ++_First)
if (_Pred(*_First))
break;
return (_First);
}
template<class _InIt,
class _Pr> inline
_InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{ // find first satisfying _Pred
_ASSIGN_FROM_BASE(_First,
_Find_if(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Pred));
return (_First);
}
0 意見:
張貼留言