Bootstrap

C++的STL之find_first_of

find_first_of         //找第一个符合条件的位置


find_last_of         //找最后一个符合条件的位置

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<vector>  
#include<algorithm>  
using namespace std;  
/***************************************** 
//所有容器适用 
find_first_of(b,e,sb,se); 
find_first_of(b,e,sb,se,bp); 
使用逆向迭代器 实现find_last_of算法 
*****************************************/  
  
/****************************************************** 
string查找函数和STL查找算法的比较 
-------------------------------------------- 
string函数                    STL算法 
find()                      find() 
rfind()                     find()+逆向迭代器 
find()                      search() 
find()                      find_end() 
find_first_of()             find_first_of() 
find_last_of()              find_first_of()+逆向迭代器 
******************************************************/  
  
/************************************************************************************* 
std::find_first_of()           所有容器适用                                algorithm 
-------------------------------------------------------------------------------------- 
template <class ForwardIterator1, class ForwardIterator2> 
ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1, 
                                 ForwardIterator2 first2, ForwardIterator2 last2 ); 
 
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 
ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1, 
                                 ForwardIterator2 first2, ForwardIterator2 last2, 
                                 BinaryPredicate pred ); 
 
//eg: 
template<class ForwardIterator1, class ForwardIterator2> 
ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1, 
                                 ForwardIterator2 first2, ForwardIterator2 last2) 
{ 
    for ( ; first1 != last1; ++first1 ) 
        for (ForwardIterator2 it=first2; it!=last2; ++it) 
            if (*it==*first1)          // or: if (comp(*it,*first)) for the pred version 
                return first1; 
    return last1; 
} 
*************************************************************************************/  
  
//不分大小写  
bool comp_case_insensitive (char c1, char c2)  
{  
    return (tolower(c1)==tolower(c2));  
}  
  
void SplitFilename (const string& str);  
  
int main ()  
{  
    int mychars[] = {'a','b','c','A','B','C'};  
    vector<char> myvector (mychars,mychars+6);  
    vector<char>::iterator it;  
  
    int match[] = {'A','B','C'};  
  
    cout<<"母串:a b c A B C\n";  
    cout<<"子串:A B C\n";  
  
    // using default comparison:  
    it = find_first_of (myvector.begin(), myvector.end(), match, match+3);  
  
    if (it!=myvector.end())  
        cout << "first match is: " << *it << endl;  
  
    // using predicate comparison:  
    it = find_first_of (myvector.begin(), myvector.end(),  
                        match, match+3, comp_case_insensitive);  
  
    if (it!=myvector.end())  
        cout << "first match is: " << *it << endl;  
/**----------------------------find_first_of()+逆向迭代器-------------------------------**/  
    vector<char>::reverse_iterator rit; // 逆向迭代器  
    rit = find_first_of (myvector.rbegin(), myvector.rend(), match, match+3);  
  
    if (rit!=myvector.rend())  
        cout << "last match is: " << *rit << endl;  
  
    cout<<endl;  
/**----------------------------string-------------------------------**/  
/********************************************************************* 
std::string::find_last_of                                       string 
----------------------------------------------------------------------- 
size_t find_last_of ( const string& str, size_t pos = npos ) const; 
size_t find_last_of ( const char* s, size_t pos, size_t n ) const; 
size_t find_last_of ( const char* s, size_t pos = npos ) const; 
size_t find_last_of ( char c, size_t pos = npos ) const; 
***********************************************************************/  
    string str1 ("/usr/bin/man");  
    string str2 ("c:\\windows\\winhelp.exe");  
  
    SplitFilename (str1);  
    cout<<endl;  
    SplitFilename (str2);  
  
    return 0;  
}  
void SplitFilename (const string& str)  
{  
  size_t found;  
  cout << "Splitting: " << str << endl;  
  found=str.find_last_of("\\/");  
  cout << " folder: " << str.substr(0,found) << endl;  
  cout << " file: " << str.substr(found+1) << endl;  
}  
/***** 
Output 
    母串:a b c A B C 
    子串:A B C 
    first match is: A 
    first match is: a 
    last match is: C 
 
    Splitting: /usr/bin/man 
     folder: /usr/bin 
     file: man 
 
    Splitting: c:\windows\winhelp.exe 
     folder: c:\windows 
     file: winhelp.exe 
*/  


;