標準庫定義了一些泛型演算法,作為實現容器的某些操作(查詢、拷貝、排序等)的公共介面。泛型意味著這些演算法可以用於不同型別的元素和多種容器型別。泛型演算法本身不執行容器的操作,它們執行在迭代器之上,執行迭代器的操作。泛型演算法一般定義在標頭檔案algorithm
中。此外在numeric
也定義了一組陣列泛型演算法。下面具體記錄幾個常用的泛型演算法的使用方法。
使用find
進行查詢,傳遞給find
的前兩個元素指示查詢範圍,第三個元素指示要找到元素值。若找到與給定元素值相等的元素,則返回指向第乙個給定值的元素的迭代器,若無匹配元素,則返回第二個引數。因此我們可以通過判斷該演算法是返回值是否等於傳入的第二個引數來判斷指定範圍中是否存在我們要找的元素。
vector<
int> nums =
;auto fun =
[&nums]
(vector<
int>
::iterator it)
;int val1 =
9, val2 =10;
auto it1 =
find
(nums.
begin()
, nums.
end(
), val1)
;//找與val1相等的元素
auto it2 =
find
(nums.
begin()
, nums.
end(
), val2)
;//找與val2相等的元素
fun(it1)
;//輸出9
fun(it2)
;//輸出can't find
使用copy
將乙個容器中的指定範圍的元素拷貝到目標序列的指定位置。傳入的前兩個引數指示要拷貝的元素的範圍,第三個引數指示拷貝到的目標序列的起始位置。copy
返回指向拷貝到目標序列的最後乙個元素的後一位置(即尾後位置)的迭代器。注意目標序列應有足夠的空間容納指定範圍的元素。
在如下示例中,nums1
中指定範圍的元素被拷貝到nums2
的指定位置。通過輸出可以看到拷貝成功,同時返回的迭代器確實指向拷貝完成後的尾後位置。
vector<
int> nums1 =
;vector<
int>
nums2
(nums1.
size()
);cout <<
"nums1:"
<<
" "
;for
(auto num : nums1)
cout << endl <<
"nums2_before:"
<<
" ";
for(
auto num : nums2)
auto res =
copy
(nums1.
begin()
+1, nums1.
begin()
+6, nums2.
begin()
+2);
cout << endl <<
"nums2_now:"
<<
" "
;for
(auto num : nums2)
cout << endl <<
*res <<
' '<<
*(res -1)
<<
' '<<
*(res +1)
;
使用sort
進行排序,前兩個引數指定排序範圍,第三個引數指示排序規則,若不給出第三個引數,則預設採用公升序排序。
vector<
int> nums =
;sort
(nums.
begin()
, nums.
end())
;for
(auto num : nums)
當然,可以向sort
傳入第三個引數,自定義排序規則,比較方便的做法是傳入乙個lambda表示式。
vector<
int> nums =
;sort
(nums.
begin()
, nums.
end(),
(int
& a,
int& b));
for(
auto num : nums)
C 泛型演算法常用函式
c 常用泛型演算法 td中定義了很好幾種順序容器,它們自身也提供了一些操作,但是還有很多演算法,容器本身沒有提供。而在algorithm標頭檔案中,提供了許多演算法,適用了大多數順序容器。與c 11相比,很多函式在 c 17與c 20又改變了很多,下面內容基於c 11去簡單介紹.參考文獻 或 大家直...
C 常用泛型演算法的使用
include include include include include include using namespace std template void printing const vector vec cout endl void callbc int a,int b void gen...
C 泛型演算法
標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...