C++ STL 算法精选之查找篇
1.查找類算法
adjacent_find(first,last);
查找區間[first,last)內第一次出現連續的兩個相等的元素,并返回指向第一個元素的迭代器,連續元素之間的比較,默認是==
adjacent_find(first,last,pred);
用途如上,但是元素之間的比較是通過函數pred來完成,pred接受兩個容器內元素類型的元素,返回bool值
函數原型:
template <class ForwardIterator>
?? ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last )
{
? ForwardIterator next=first; ++next;
? if (first != last)
??? while (next != last)
????? if (*first++ == *next++)? // or: if (pred(*first++,*next++)), for the pred version
??????? return first;
? return last;
}
?例子:
// adjacent_find example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool myfunction (int i, int j) {
? return (i==j);
}
int main () {
? int myints[] = {10,20,30,30,20,10,10,20};
? vector<int> myvector (myints,myints+8);
? vector<int>::iterator it;
? // using default comparison:
? it = adjacent_find (myvector.begin(), myvector.end());
? if (it!=myvector.end())
??? cout << "the first consecutive repeated elements are: " << *it << endl;
? //using predicate comparison:
? it = adjacent_find (++it, myvector.end(), myfunction);
? if (it!=myvector.end())
??? cout << "the second consecutive repeated elements are: " << *it << endl;
?
? return 0;
}
?
Output:
the first consecutive repeated elements are: 30
the second consecutive repeated elements are: 10
?find(first,last,value);
?查找區間[first,last)之間內值為value的元素,返回迭代器類型,若沒找到,則返回迭代器末尾end 函數原型:
?template<class InputIterator, class T>
? InputIterator find ( InputIterator first, InputIterator last, const T& value )
? {
??? for ( ;first!=last; first++) if ( *first==value ) break;
??? return first;
? }
例子:// find example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main () {
? int myints[] = { 10, 20, 30 ,40 };
? int * p;
? // pointer to array element:
? p = find(myints,myints+4,30);
? ++p;
? cout << "The element following 30 is " << *p << endl;
? vector<int> myvector (myints,myints+4);
? vector<int>::iterator it;
? // iterator to vector element:
? it = find (myvector.begin(), myvector.end(), 30);
? ++it;
? cout << "The element following 30 is " << *it << endl;
? return 0;
}
?
Output:
The element following 30 is 40
The element following 30 is 40
find_if(first,last,pred);
返回區間[first,last)內第一個使pred函數返回為真的元素的迭代器,否則返回last注意:pred接受一個參數函數原型:
template<class InputIterator, class Predicate>
? InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )
? {
??? for ( ; first!=last ; first++ ) if ( pred(*first) ) break;
??? return first;
? }
例子:// find_if example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool IsOdd (int i) {
? return ((i%2)==1);
}
int main () {
? vector<int> myvector;
? vector<int>::iterator it;
? myvector.push_back(10);
? myvector.push_back(25);
? myvector.push_back(40);
? myvector.push_back(55);
? it = find_if (myvector.begin(), myvector.end(), IsOdd);
? cout << "The first odd value is " << *it << endl;
? return 0;
}
?
Output:
The first odd value is 25
?
find_first_of(first1,last1,first2,last2);
find_first_of(first1,last1,first2,last2,pred);
返回一個迭代器,使得[first2,last2)之中任意一個元素第一次出現在區間[first1,last1)中。
默認比較為==,當然也可以自己定義pred函數(接受2個參數),返回bool型 函數原型:
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;
}
例子:// find_first_of example
#include <iostream>
#include <algorithm>
#include <cctype>
#include <vector>
using namespace std;
bool comp_case_insensitive (char c1, char c2) {
? return (tolower(c1)==tolower(c2));
}
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'};
? // 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;
?
? return 0;
}
?
Output:
First match is: A
First match is: a
?
find_end(first1,last1,first2,last2);
find_end(first1,last1,first2,last2,pred);
返回一個元素迭代器,使得在區間[first1,last1)中最后一次出現[fiest2,last2),
默認比較為==,當然也可以寫自己的比較函數pred,接受兩個參數,返回bool值函數原型:
template<class ForwardIterator1, class ForwardIterator2>
? ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
????????????????????????????? ForwardIterator2 first2, ForwardIterator2 last2)
{
? ForwardIterator1 it1, limit, ret;
? ForwardIterator2 it2;
? limit=first1; advance(limit,1+distance(first1,last1)-distance(first2,last2));
? ret=last1;
? while (first1!=limit)
? {
??? it1 = first1; it2 = first2;
??? while (*it1==*it2)????????? // or: while (pred(*it1,*it2)) for the pred version
????? { ++it1; ++it2; if (it2==last2) {ret=first1;break;} }
??? ++first1;
? }
? return ret;
}
例子:// find_end example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool myfunction (int i, int j) {
? return (i==j);
}
int main () {
? int myints[] = {1,2,3,4,5,1,2,3,4,5};
? vector<int> myvector (myints,myints+10);
? vector<int>::iterator it;
? int match1[] = {1,2,3};
? // using default comparison:
? it = find_end (myvector.begin(), myvector.end(), match1, match1+3);
? if (it!=myvector.end())
??? cout << "match1 last found at position " << int(it-myvector.begin()) << endl;
? int match2[] = {4,5,1};
? // using predicate comparison:
? it = find_end (myvector.begin(), myvector.end(), match2, match2+3, myfunction);
? if (it!=myvector.end())
??? cout << "match2 last found at position " << int(it-myvector.begin()) << endl;
?
? return 0;
}
?
Output:
Match found at position 5
Match found at position 3
??
?
總結
以上是生活随笔為你收集整理的C++ STL 算法精选之查找篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解 __doPostBack
- 下一篇: 1 2 5组合100,有多少种方法