不會改變操作物件內容的STL演算法(元素查詢,序列查詢,統計元素個數,比較區間,找最值)
元素查詢,序列查詢,統計元素個數,比較區間,找最值
一、單個元素查詢: find, find_if, adjacent_find, find_first_of
1、find:查詢元素val
template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last) {
if (*first==val) return first;
++first;
}
return last;
}
2、find_if:查詢滿足pred(*first)條件的元素
template<class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) return first;
++first;
}
return last;
}
此時可能的UnaryPredicate有,bind2nd(equal_to<int>(), 0),bind2nd(less<int>(), 0),自定義等
3、adjacent_find:查詢兩個相鄰的元素或者前後兩個元素滿足條件pred(*first,*next)
template <class ForwardIterator>
ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
{
if (first != last)
{
ForwardIterator next=first; ++next;
while (next != last) {
if (*first == *next) // or: if (pred(*first,*next)), for version (2)
return first;
++first; ++next;
}
}
return last;
}
4、find_first_of:查詢[first1,last1)內第一個等於[first2,last2)內的任意一個元素,或滿足條件pred(*it,*first)的元素
template<class InputIterator, class ForwardIterator>
InputIterator find_first_of ( InputIterator first1, InputIterator last1,
ForwardIterator first2, ForwardIterator last2)
{
while (first1!=last1) {
for (ForwardIterator it=first2; it!=last2; ++it) {
if (*it==*first1) // or: if (pred(*it,*first)) for version (2)
return first1;
}
++first1;
}
return last1;
}
二、子序列匹配(子序列查詢): search, find_end, search_n
1、search 在區間[first1,last1)查詢第一次出現的子序列[first2,last2)
Searches the range [first1,last1) for the first occurrence of the sequence defined by [first2,last2), and returns an iterator to its first element, or last1 if no occurrences are found.template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2)
{
if (first2==last2) return first1; // specified in C++11
while (first1!=last1)
{
ForwardIterator1 it1 = first1;
ForwardIterator2 it2 = first2;
while (*it1==*it2) { // or: while (pred(*it1,*it2)) for version 2
++it1; ++it2;
if (it2==last2) return first1;
if (it1==last1) return last1;
}
++first1;
}
return last1;
}
2、find_end 在區間[first1,last1)查詢最後一次出現的子序列[first2,last2)
這個函式名字有點問題,不應該和find歸在一起,應該是search_end
Searches the range [first1,last1) for the last occurrence of the sequence defined by [first2,last2), and returns an iterator to its first element, or last1 if no occurrences are found.
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2)
{
if (first2==last2) return last1; // specified in C++11
ForwardIterator1 ret = last1;
while (first1!=last1)
{
ForwardIterator1 it1 = first1;
ForwardIterator2 it2 = first2;
while (*it1==*it2) { // or: while (pred(*it1,*it2)) for version (2)
++it1; ++it2;
if (it2==last2) { ret=first1; break; }
if (it1==last1) return ret;
}
++first1;
}
return ret;
}
3、search_n 查詢區間[first,last)中由count個相鄰元素形成的子序列,其中所有元素都等於value
Searches the range [first,last) for a sequence of count elements, each comparing equal to val (or for which pred returns true).template<class ForwardIterator, class Size, class T>
ForwardIterator search_n (ForwardIterator first, ForwardIterator last,
Size count, const T& val)
{
ForwardIterator it, limit;
Size i;
limit=first; std::advance(limit,std::distance(first,last)-count);
while (first!=limit)
{
it = first; i=0;
while (*it==val) // or: while (pred(*it,val)) for the pred version
{ ++it; if (++i==count) return first; }
++first;
}
return last;
}
三、計算區間中某個元素個數:count, count_if
1、count:計算區間[first,last)中和val相等的元素的個數
template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count (InputIterator first, InputIterator last, const T& val)
{
typename iterator_traits<InputIterator>::difference_type ret = 0;
while (first!=last) {
if (*first == val) ++ret;
++first;
}
return ret;
}
2、count_if:計算區間[first,last)中滿足條件pred(*first)的元素的個數
template <class InputIterator, class UnaryPredicate>
typename iterator_traits<InputIterator>::difference_type
count (InputIterator first, InputIterator last, UnaryPredicate pred)
{
typename iterator_traits<InputIterator>::difference_type ret = 0;
while (first!=last) {
if (pred(*first)) ++ret;
++first;
}
return ret;
}
此時可能的UnaryPredicate有,bind2nd(equal_to<int>(), 0),bind2nd(less<int>(), 0),自定義等
四、for_each遍歷區間[first,last)中的每個元素並將Function fn套用在每個元素上
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
while (first!=last) {
fn (*first);
++first;
}
return fn; // or, since C++11: return move(fn);
}
五:比較兩個區間:equal, mismatch, lexicographical_compare
1、equal:當區間[first1,last1)中的元素和區間[first2,first2+(last1-first1))一一比較,如果都相等或滿足pred(*first1,*first2)條件,則返回true,否則返回false
template <class InputIterator1, class InputIterator2>
bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{
while (first1!=last1) {
if (!(*first1 == *first2)) // or: if (!pred(*first1,*first2)), for version 2
return false;
++first1; ++first2;
}
return true;
}
2、mismatch:返回區間[first1,last1)中的元素和區間[first2,first2+(last1-first1))之間第一個元素值不同的位置(有兩個位置,每個區間一個)
template <class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2>
mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{
while ( (first1!=last1) && (*first1==*first2) ) // or: pred(*first1,*first2), for version 2
{ ++first1; ++first2; }
return std::make_pair(first1,first2);
}
3、lexicographical_compare:以字典排序法比較,[first1,last1)小於[first2,last2)的話,返回true,否則返回false
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2);
template <class InputIterator1, class InputIterator2, class Compare>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
Compare comp);
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2)
{
while (first1!=last1)
{
if (first2==last2 || *first2<*first1) return false;
else if (*first1<*first2) return true;
++first1; ++first2;
}
return (first2!=last2);
}
六:最大值和最小值:min, max, min_element, max_element
1、min:返回兩個物件a, b之間比較小的那個或滿足!comp(b,a)?a:b;
template <class T> const T& min (const T& a, const T& b) {
return !(b<a)?a:b; // or: return !comp(b,a)?a:b; for version (2)
}
2、max:返回兩個物件a, b之間比較大的那個或滿足!comp(b,a)?a:b;
template <class T> const T& max (const T& a, const T& b) {
return (a<b)?b:a; // or: return comp(a,b)?b:a; for version (2)
}
3、min_element:找到區間[first,last)內最小的元素
template <class ForwardIterator>
ForwardIterator min_element ( ForwardIterator first, ForwardIterator last )
{
if (first==last) return last;
ForwardIterator smallest = first;
while (++first!=last)
if (*first<*smallest) // or: if (comp(*first,*smallest)) for version (2)
smallest=first;
return smallest;
}
4、max_element:找到區間[first,last)內最大的元素
template <class ForwardIterator>
ForwardIterator max_element ( ForwardIterator first, ForwardIterator last )
{
if (first==last) return last;
ForwardIterator largest = first;
while (++first!=last)
if (*largest<*first) // or: if (comp(*largest,*first)) for version (2)
largest=first;
return largest;
}
相關文章
- c++map 查詢元素和list查詢元素速度對比C++
- 二分查詢—包括查詢第一個目標元素和最後一個目標元素
- jQuery之元素查詢jQuery
- jQuery查詢第n個li元素jQuery
- 陣列的主元素查詢陣列
- 遞迴查詢子元素遞迴
- 【LeetCode-陣列】查詢大多數元素LeetCode陣列
- 查詢演算法__插值查詢演算法
- 查詢Set中重複的元素
- c++中的查詢list元素C++
- Java中查詢列表的峰值元素Java
- 查詢最大元素 hd 2025
- mysql timestamp比較查詢MySql
- 在排序陣列中查詢元素的第一個和最後一個位置排序陣列
- 探討一個比較複雜的查詢
- 日期區間查詢
- Java中查詢陣列多數元素的4種方法Java陣列
- jQuery查詢帶有class樣式的元素jQuery
- Excel查詢兩列資料相同的元素Excel
- 查詢陣列中第K大的元素陣列
- 恕我直言你可能真的不會java第9篇-Stream元素的匹配與查詢Java
- 【Java】陣列二分查詢元素Java陣列
- oracle查詢語句查詢增加一列內容Oracle
- kotlin 集合內元素比較Kotlin
- Java ArrayList 查詢、刪除指定元素;排序;遍歷;隨機獲取元素等常用操作Java排序隨機
- C#演算法設計查詢篇之03-插值查詢C#演算法
- 查詢固定條數的某個值之和
- 插值查詢演算法演算法
- 如何找東西?查詢演算法之順序查詢和二分查詢詳解演算法
- 題解1232:查詢最大元素 (Java描述)Java
- 同一張表的兩個欄位比較查詢
- iPhone序列號和保修期怎麼查?iPhone序列號查詢啟用時間查詢教程iPhone
- 查詢演算法__Fibonacci查詢演算法
- BST查詢結構與折半查詢方法的實現與實驗比較
- 34. 在排序陣列中查詢元素的第一個和最後一個位置(中)排序陣列
- ACM常用STL查詢手冊ACM
- 二分只能用來查詢元素嗎?
- 比較爽的導航查詢 功能 - SqlSugar ORMSqlSugarORM
- 殺會話之查詢鎖表的物件及相關操作會話物件