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
*/