STL中泛型算法find_if()与sort()的应用举例及详解

STL中泛型算法find_if()与sort()的应用举例及详解

 

请认真看下原型:

//find_if()的原型: template InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred ); //sort()的原型: template void sort ( RandomAccessIterator first, RandomAccessIterator last ); template void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

经常可以看到这种用法:
// sort algorithm example #include #include #include using namespace std; bool myfunction (int i,int j) { return (i myvector (myints, myints+8); // 32 71 12 45 26 80 53 33 vector::iterator it; // using default comparison (operator <): sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33 // using function as comp sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80) // using object as comp sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80) // print out content: cout << "myvector contains:"; for (it=myvector.begin(); it!=myvector.end(); ++it) cout << " " << *it; cout << endl; return 0; }

17行比较好理解,19行怎么解释呢?如果想在比较函数中加入参数又应如何解决呢?

请看下面这个例子,在C++中class与struct在这方面的应用没有太大差别,我这里用struct来实现Predicate pred与Compare comp。

//! /brief 检索得分映射结构体 struct score_doc { double score; string doc_id; score_doc(string doc = "", double score = 0.0):doc_id(doc), score(score){} }; typedef vector SCORE_VCT; //! /brief 用于比较score_doc结构体实例 struct score_doc_compare { //! 用于排序算法 bool operator ()(const struct score_doc *sd1, const struct score_doc *sd2) const { return sd1->score > sd2->score; } //! 用于查找算法 bool operator ()(const struct score_doc *sd) const { return sd->doc_id == m_doc_id; } //! 用于排序算法 score_doc_compare(){} //! 用于查找算法 score_doc_compare(string doc_id):m_doc_id(doc_id){} private: string m_doc_id; }; //! 查找用法 it_vct = find_if(r_rslt_ptr->score_doc_vct.begin(),r_rslt_ptr->score_doc_vct.end(), score_doc_compare("文档1")); if(r_rslt_ptr->score_doc_vct.end() != it_vct) { cout << "存在文档1" << endl; } //! 排序用法 sort(r_rslt_ptr->score_doc_vct.begin(),r_rslt_ptr->score_doc_vct.end(), score_doc_compare());

由此可见find_if()调用的实际是score_doc_compare("文档1")(),同理sort()调用的是score_doc_compare()()。
在C++中,score_doc_compare("文档1")或score_doc_compare()创建了一个结构体实例,然后由find_if()或sort()调用了()操作符。
如果想加入参数,如上例中find_if的用法,只需在Compare comp中添加载入对应参数的构造函数和成员变量,然后重载()操作符时调取这个成员变量当参数就OK了。

你可能感兴趣的:(C/C++,算法,struct,class,string,文档,iterator)