常用演算法(Algorithm)概述

2021-08-28 20:08:56 字數 4508 閱讀 2568

參看內容: vc知識庫

演算法部分主要由標頭檔案組成。

adjacent_find()( adjacent 是鄰近的意思),binary_search(),count(),

count_if(),equal_range(),find(),find_if()。

merge(),sort(),random_shuffle()(shuffle是洗牌的意思) ,reverse()。
copy(), replace(),

replace_if(),swap()

accumulate()( accumulate 是求和的意思),fill(),。
set_union(),set_intersection(),

set_difference()。

for_each(), transform()( transform 是變換的意思)
adjacent_find()

在iterator對標識元素範圍內,查詢一對相鄰重複元素,找到則返回指向這對元素的第乙個元素的迭代器。否則返回past-the-end。

例如:vecint是用vector宣告的容器,現已包含1,2,2,4,5元素。

vector::iterator it=adjacent_find(vecint.begin(),vecint.end());

此時*it == 2

binary_search

在有序序列中查詢value,找到則返回true。

注意:在無序序列中,不可使用。

例如:setint是用set宣告的容器,現已包含1,3,5,7,9元素。

bool bfind = binary_search(setint.begin(),setint.end(),5);

此時bfind == true

count

利用等於操作符,把標誌範圍內的元素與輸入值比較,返回相等的個數。

count_if

利用輸入的函式,對標誌範圍內的元素進行比較操作,返回結果為true的個數。

例如:vecint是用vector宣告的容器,已包含1,3,5,7,9元素,現要求求出大於等於3的元素個數

//先定義比較函式

bool

greaterthree

(int inum)

else

}

int icount = count_if(vecinta.begin(), vecinta.end(), greaterthree);

//此時icount == 4

equal_range

返回一對iterator,第乙個表示lower_bound,第二個表示upper_bound

find

利用底層元素的等於操作符,對指定範圍內的元素與輸入值進行比較。當匹配時,結束搜尋,返回該元素的迭代器。

例如:vecint是用vector宣告的容器,已包含1,3,5,7,9

vector::iterator it = find(vecint.begin(),vecint.end(),5);

此時*it == 5

find_if

使用輸入的函式代替等於操作符執行find。返回被找到的元素的迭代器。

例如:vecint是用vector宣告的容器,已包含1,3,5,3,9元素。現要找出第乙個大於等於3的元素的迭代器。

vector::iterator it = find_if(vecint.begin(),vecint.end(),greaterthree);

此時*it==3, *(it+1)==5, *(it+2)==3, *(it+3)==9

以下是排序和通用演算法:提供元素排序策略

merge

合併兩個有序序列,存放到另乙個序列。

例如:vecinta,vecintb,vecintc是用vector宣告的容器,vecinta已包含1,3,5,7,9元素,vecintb已包含2,4,6,8元素

vecintc.resize(9); //擴大容量

merge(vecinta.begin(),vecinta.end(),vecintb.begin(),vecintb.end(),vecintc.begin());

此時vecintc就存放了按順序的1,2,3,4,5,6,7,8,9九個元素

sort

以預設公升序的方式重新排列指定範圍內的元素。若要改排序規則,可以輸入比較函式。

例如:vecint是用vector宣告的容器,已包含2,1,4,3,6,5元素

sort(vecint.begin(),vecint.end());

此時,vecint包含了1,2,3,4,5,6元素。

如果vector,t是自定義型別,則要提供t型別的比較函式。

學生類有學號跟姓名的屬性,有乙個存著學生物件的vector容器,要使該容器按學號公升序排序。

//學生類

class cstudent

:int m_iid;

string m_strname;

}//學號比較函式

bool

compare

(const cstudent &stua,

const cstudent &stub)

void

main()

random_shuffle

對指定範圍內的元素隨機調整次序。

reverse

對指定範圍內元素重新反序排序。

copy

複製序列

例如:vecinta,vecintb是用vector宣告的物件,vecinta已包含1,3,5,7,9元素。

vecintb.

resize(5

);copy

(vecinta.

begin()

,vecinta.

end(

),vecintb.

begin()

);

此時vecintb也包含了1,3,5,7,9元素

replace(beg,end,oldvalue,newvalue)

將指定範圍內的所有等於oldvalue的元素替換成newvalue。

replace_if

將指定範圍內所有操作結果為true的元素用新值替換。

用法舉例:

replace_if(vecinta.begin(),vecinta.end(),greaterthree,newval)

其中vecinta是用vector宣告的容器

greaterthree函式的原型是bool greaterthree(int inum)

swap

交換兩個容器的元素

accumulate

對指定範圍內的元素求和,然後結果再加上乙個由val指定的初始值

fill

將輸入值賦給標誌範圍內的所有元素。

set_union

構造乙個有序序列,包含兩個有序序列的並集。

set_intersection

構造乙個有序序列,包含兩個有序序列的交集。

set_difference

構造乙個有序序列,該序列保留第乙個有序序列中存在而第二個有序序列中不存在的元素。

for_each

用指定函式依次對指定範圍內所有元素進行迭代訪問。該函式不得修改序列中的元素

transform

與for_each類似,遍歷所有元素,但可對容器的元素進行修改

Algorithm 排序演算法

閒來無事回顧一下原來所學的排序演算法,包括冒泡 選擇 插入 希爾 快速 歸併排序,這六種。首先依次講解原理,最後放出實現及測試速度原始碼。我想大部分人學習的第乙個排序演算法就是這個。顧名思義,如泡泡般,越到水面就越大,即經過連續不斷的判斷,選取大 或小 的值進行交換,一輪結束後,未排序資料最後面的就...

基礎演算法 algorithm

標頭檔案 include sort first,last,compare next permutation first,last unique first,last sort first,last,compare frist 排序起始位置 指標或iterator last 排序終止位置 指標或ite...

algorithm常用庫函式

algorithm常用庫函式 accumulate 累加序列的所有元素 adjacent difference 計算序列中的相鄰元素是否不同 adjacent find 查詢相鄰的兩個相同 或者有其他關聯 元素 any of 如果對於任意元素的謂詞測試都為true,則返回true c 11 all ...