C 泛型演算法簡介

2021-07-10 04:58:31 字數 2520 閱讀 1677

人不舒服寫篇部落格壓壓驚。。。

主要一些常見應用於容器的函式。這些演算法一般位於標頭檔案algorithm和標頭檔案numeric中

find 查詢

accumulate 求和

equal 比較

例如:

//find(const_iterator,const_iterator,target);

//return const_iterator

vector

nums = ;

auto it =find(nums.cbegin(), nums.cend(), 2);

auto it2=find(nums.cbegin(), nums.cend(), 6);

cout

<< *it << endl; //輸出 2

cout

<< *(--it2) << endl;//輸出 5

迭代器指示查詢範圍,返回查詢結果迭代器,若查詢失敗則會返回nums.end(),即最後乙個元素的後乙個位置。

//accumulate(const_iterator,const_iterator,val);

vector

nums = ;

int sum = accumulate(nums.cbegin(), nums.cend(), 0);

int sum2 = accumulate(nums.cbegin(), nums.cend(), 10);

cout

<< sum << endl;//輸出 21

cout

<< sum2 << endl;//輸出 22

迭代器指示求和範圍,最後乙個引數可以理解為初始值。

//equal(const_iterator1,const_iterator1,const_iterator2);

vector

nums = ;

vector

nums2 = ;

vector

nums3 = ;

bool flag = equal(nums.cbegin(), nums.cend(), nums2.cbegin());

cout

<< flag << endl;//0

flag = equal(nums.cbegin(), nums.cend(), nums2.cbegin());

cout

<< flag << endl;//1

前兩個迭代器指示第乙個容器的比較範圍,第三個迭代器表示第二個容器的起始位置,這裡必須保證一點: nu

ms2.s

ize(

)≥nu

ms1.s

ize(

) 否則會出如下錯誤:debug assertion failed

注:唯讀演算法使用const迭代器,不改變容器的內容。

顧名思義可以修改容器內容:

fill & fill_n 填充

copy 拷貝

replace 替代

例如:

//fill(iterator,iterator,val);

//fill_n(iterator,size,val);

vector

nums = ;

fill(nums.begin(),nums.end(),0);//所有元素為0

fill_n(nums.begin(),nums.size(),1);//所有元素為1

fill_n(nums.begin(),nums.size()+1,1);//error

fill和fill_n無法改變容器的大小,當填充的範圍超過容器的大小,則會報錯:debug assertion failed

vector

nums = ;

vector

nums2 = ;

copy(nums2.begin(), nums2.end(), nums.begin());

引數分別是源範圍和目的起始迭代器範圍,保證目的容器的大小至少等於源容器大小。

vector

nums = ;

replace(nums.begin(),nums.end(),2,0);

將容器中值為2的元素替換為0

sort 排序

unique 去重

我們知道這些泛型演算法不改變容器的大小,所以上述去重實際上並不是刪除重複元素,而是將不重複元素放到前面,而返回最後乙個不重複元素之後的位置。我們需要使用容器自帶的erase函式來真正去重

例如:

vector

nums = ;

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

auto end_unique = unique(nums.begin(), nums.end());

nums.erase(end_unique,nums.end());

C 泛型簡介

在前面已經介紹了類和方法的定義,那麼泛型究竟有什麼作用呢?在前面 c 集合 一節中介紹了集合,集合中的項允許是 object 型的值,因此可以存放任意型別的值 例如,在 arraylist 中以 double 型別存入學生考試成績,但存入值時並沒有做驗證,存入了其他資料型別的值,如下。arrayli...

泛型 泛型簡介和泛型類

在泛型引入之前,如果我們需要產生多個物件,每個物件的邏輯完全一樣,只是物件內的成員變數的型別不同,那麼我們只能建立多個類檔案,給每個類的成員變數設定不同的資料型別。這麼做會導致類的膨脹,重用性太差。一種方式是對將object作為變數型別,但是需要對獲取的資料進行強制型別轉換,這個過程可能導致型別轉換...

C 泛型演算法

標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...