C 裡的通用演算法

2021-08-22 09:26:41 字數 3181 閱讀 6022

標準

c++庫裡面提供了很多的通用演算法

,比如查詢

,排序等等

, 這些演算法完全建立在

stl的基礎上

,是最先進演算法的優良實現

,有極好的效能, 和

c庫里的演算法相比

,一點也不遜色.

通常這些演算法是對標準容器的操作,比如

vector, list, map

等等,

在用的時候非常靈活

,所有的演算法包含在裡,

下面我會做一些典型的介紹.

首先是一段不用任何演算法的**:

int f(vector& c)

return 0;}

下面引入第乙個演算法

:find_if

bool less_than_7(int v)

int f2(vector& c)

less_than_7

是我們編寫的乙個函式

, 用於演算法

find_if.

演算法的作用是找到

vector

裡所有的元素小於

7的序列

. 請看另外乙個實現相同功能的方式

:函式物件.

函式物件,如果乙個類具有應用運算子,我們就稱其為函式物件.

class less_than

bool operator()(int x)

這裡我們換成乙個類

, 比較的值可以傳進類裡

, 實現了更大的靈活性

. 進一步

, 我們把比較的值的型別抽象

, 把函式物件變為模板:

template

class less_than

bool operator()(t x) 像

less_than

這樣的物件我們經常用到

,那麼有沒有庫里實現好的

,我們直接拿來用的呢?有的

!下面我們介紹基本的謂詞:

謂詞就是返回bool的函式或函式物件.

void f4(vector& vi,list& li)

greater_equal

就是庫里的乙個常用謂詞

: return arg1>=arg2, mismatch

也是庫里的演算法

, 意思是找到兩個序列相異的第乙個元素

.在這裡就是尋找

vector

中小於在

list

中對應元素的第乙個元素.

在裡,標準庫里提供了一些常用的謂詞,如

:equal_to, less, greater等,

當然我們也可以開發自己的謂詞

, 比如下面乙個:

class myequal:public unary_function

bool operator() (const teacher & t) const };

…listli;

list::iterator it=find_if(li.begin(),li.end(),myequal(「

張三」));

上面**的功能是找到教師序列裡名字為

」 張三

」的老師.其中

unary_function

是所有一元謂詞物件的基類.

約束器,通過將乙個引數約束到某個值,我們可以將兩個引數的函式物件當作乙個引數的函式物件使用.

對於上面的例子:

less_than les(7);

vector::iterator it=find_if(c.begin(),c.end(),les);

less_than

是我們額外寫的乙個類

, 如果我們不想寫自己的類

, 而直接利用庫里的謂詞

less,

這樣豈不是更好嗎

? 約束器就是滿足這種需求:

vector::iterator it=find_if(c.begin(),c.end(),bind2nd(less(),7);

bind2nd

就是乙個常用的約束器

,它把二元謂詞

less

和常數7

出發建立起一元謂詞」小於

7」.

成員函式介面卡,使成員函式可以被用做演算法引數.

void draw_all(list& lsp)

這裡是通過指標呼叫成員函式的

,如果需要引數

,那麼我們就可以用到前面講的

bind2nd了:

void draw_all(list& lsp,int angle)

函式指標介面卡,使函式適指標可以用作演算法引數.

void draw(const int angle);

void draw_all(list& lsp)

否定器,描述某個謂詞的否定.

void f7(vector& vi,listli)

謂詞,約束器,

介面卡和否定器都定義在裡.

有些一下子看起來比較生僻

,這是乙個習慣問題

, 你熟悉了

,也就覺得很自然了

.而且這些都在標準庫里

, 可移植性都很高.

這裡只是介紹一些基本的入門知識

, 通過這些初步的**

,我們知道演算法可以節省我們大量的精力

,避免我們為這些常見的演算法一再的去重複勞動

, 而且**更精簡

.

CRC 通用演算法

crc通用演算法 version 1.0 by yinpei wuhan university 2006年11月18日 define crc num n 定義每種crc的校驗碼位元數 crc num 32 32 crc num 24 24 crc num 16 16 crc num 12 12 cr...

在struts裡的實現dtree通用樹型結構

在這裡簡單介紹一下該樹型結構的做法 2 我們看看樹的主要字段 id 主鍵 pid 父類id name 結點名稱 url 結點連線的url title 類似alt的一種結點顯示內容 target 連線開啟的目標 icon 檔案,沒有指定將使用預設的 open boolean型別,結點是否開啟。上面是用...

通用氣泡排序演算法

通常的氣泡排序演算法只能解決指定型別的資料以及固定的公升序或者降序排列,而當我們學習了c 模板以及仿函式的之後,我們就可以寫乙個通用的冒泡演算法來處理不同型別資料以及想要排序的方式。void bubblesort int array,size t sz 這是通常的氣泡排序演算法,只能處理整型資料,以...