STL源碼剖析 算法開篇

  • STL源碼剖析 算法章節 算法總覽_CHYabc123456hh的博客-CSDN博客

質變算法

  • 質變算法 - 會改變操作對象的數值,比如互換、替換、填寫、刪除、排列組合、分隔、隨機重排、排序等
#include <iostream>
#include <vector>int main(){int ia[] = {22,30,20,34,45,64,34,56,75,34};std::vector<int>iv(ia,ia+(sizeof (ia) / sizeof (int)));for (int i = 0; i < iv.size(); ++i) {std::cout << iv[i] << ' ';}std::cout << std::endl;std::cout << iv.size() << ' ';//錯誤的 sort屬于質變算法 不應該使用const迭代器
//    std::vector<int>::const_iterator cit1 = iv.begin();
//    std::vector<int>::const_iterator cit2 = iv.end();
//    std::sort(iv.begin(),iv.end());std::vector<int>::iterator cit1 = iv.begin();std::vector<int>::iterator cit2 = iv.end();std::sort(cit1,cit2);}

非質變算法

  • 運算過程中不會改變 迭代器標示出來的區間上的元素內容。查找(find)、匹配(find_if)、計數(count)、巡防(for_each)、比較(equal)、尋找極值(max、min)等
  • 但是如果在迭代區間上應用一個會改變元素內容的仿函數,也會改變元素的數值
#include <iostream>
#include <vector>template<class T>
struct plus2{void operator()(T& x){x += 2;}
};//template <class T>
void plus3_fun(int& x){x += 3;
//    std::cout << x << " ";
}int main(){int ia[] = {22,30,20,34,45,64,34,56,75,34};std::vector<int>iv(ia,ia+(sizeof (ia) / sizeof (int)));for (int i : iv) {std::cout << i << ' ';}std::cout << std::endl;std::cout << iv.size() << ' ';std::cout << std::endl;//    std::for_each(iv.begin(),iv.end(),plus2<int>());std::for_each(iv.begin(),iv.end(), plus3_fun);for (int i : iv) {std::cout << i << ' ';}
}
  • 算法的泛型話的主要目的是為了,抽象化操作對象的型別、操作對象的標示法和區間目標的移動行為,整個算法也就在一個抽象層面了
  • 以簡單的循環查找為例,寫一個find函數
#include<iostream>int * find(int* arrayHead,int arraySize,int value){int i = 0;for (; i < arraySize; ++i) {if (arrayHead[i] == value){break;}}return &(arrayHead[i]);
}
int main(){int array[] = {11,13,34,56,77,8,945,56};int *ptr = nullptr;std::cout << sizeof(array) << std::endl;ptr = find(array,8,13);std::cout << *ptr;
}
  • 設定end()即為指向array尾端以外的任何位置,主要目的是為了和其他array指針進行比較,但是不能提領其數值
#include<iostream>int * find(int* arrayHead,int arraySize,int value){int i = 0;for (; i < arraySize; ++i) {if (arrayHead[i] == value){break;}}return &(arrayHead[i]);
}
int main(){const int size = 8;int array[] = {11,13,34,56,77,8,945,56};int *end = array + size;//最后一個元素的位置int *ptr = nullptr;std::cout << sizeof(array)/sizeof(int) << std::endl;ptr = find(array,sizeof(array)/sizeof(int),13);if (ptr == end){std::cout << "Not found!" << std::endl;} else{std::cout << *ptr << " found!" << std::endl;}
}
  • 上述find()暴露了容器太多的細節,且太限定于特定的容器。為了讓find函數適配于所有類型的容器,其操作需要更進一步的抽象化
int * find(int* begin,int* end,int value){while (begin != end && *begin != value){++begin;}return begin;
}
  • 上述函數適用于[begin() , end) (不包含end指針,end是指最后元素的下一個位置)
#include<iostream>int * find(int* begin,int* end,int value){while (begin != end && *begin != value){++begin;}return begin;
}int main(){const int size = 8;int array[] = {11,13,34,56,77,8,945,56};int *end = array + size;//最后一個元素的位置int*ptr = find(array,end,13);if (ptr == end){std::cout << "not found" << std::endl;} elsestd::cout << *ptr << " found" << std::endl;//也可以適用于查找特定的子區間int* ip = find(array+2,array+5,3);
}
  • 更進一步將其修改為模板的形式
template<typename T> //關鍵詞typename 也可以使用class替代
T * find(T* begin,T* end,T value){//以下用到了operator!= operator* operator++//需要操作符重載while (begin != end && *begin != value){++begin;}//以下操作 會引發copy行為return begin;
}
  • 數值的傳遞可由 pass by value改為pass by reference to const 主要目的是出于不是基本數據類型,對象很大,傳遞成本很高,使用引用傳遞可以避免這些成本
  • 更進一步 超出指針的思維局限,比如find函數針對的是list,對于指針進行++運算不會將指針指向下一個串行節點,但是如果設計一個class,擁有原生指針的行為,并且對其進行++操作可以指向list的下一個節點,這里指定的是迭代器,其本質是一種智能指針,也就是行為類似指針的對象。
template <class Iterator,class T>
Iterator find(Iterator begin,Iterator end,const T& value){while (begin != end && *begin!=value){++begin;}return begin;
}    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 隨機數一維數組

題目1 創建一個長度為6的int型數組&#xff0c;要求數組元素的值都在1-30之間&#xff0c;且是隨機賦值。同時&#xff0c;要求元素的值各不相同 代碼1 public class ArrayTest2 {public static void main(String[] args) {generateArray(6);}public static void generateAr…

STL源碼剖析 數值算法 accumulate | adjacent_difference | inner_product | partial_sum | power | itoa

//版本1 template <class InputIterator,class T> T accumulate(InputIterator first,InputIterator last,T init){for(;first ! last; first){init *first; //將每個元素數值累加到init身上}return init; }//版本2 template <class InputIterator,class T,class Bin…

python官網網址是什么意思_大家都是怎么部署python網站的?

flaskgunicornnginx 作者&#xff1a;Python小白 鏈接&#xff1a;centos下通過gunicorn和nginx部署Flask項目 - Python小白的文章 - 知乎專欄 來源&#xff1a;知乎 著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。 之前用Flask寫了個解析Tu…

java回形數矩陣

題目 從鍵盤輸入一個整數&#xff08;1~20&#xff09; 則以該數字為矩陣的大小&#xff0c;把1,2,3…n*n 的數字按照順時針螺旋的形式填入其中。例如&#xff1a; 輸入數字2&#xff0c;則程序輸出&#xff1a; 1 2 4 3 輸入數字3&#xff0c;則程序輸出&#xff1a; 1 2 3 8…

STL源碼剖析 基本算法 equal | fill | iter_awap | lexicographical_compare | max | min | swap |mismatch

Equal 兩個序列在[first,last)區間內相等&#xff0c;equal()返回true。以第一個序列作為基準&#xff0c;如果第二序列元素多不予考慮&#xff0c;如果要保證兩個序列完全相等需要比較元素的個數 if(vec1.size() vec2.size() && equal(vec1.begin(),vec1.end(),vec2…

svm分類器訓練詳細步驟_「五分鐘機器學習」向量支持機SVM——學霸中的戰斗機...

大家好&#xff0c;我是愛講故事的某某某。 歡迎來到今天的【五分鐘機器學習】專欄內容 --《向量支持機SVM》 今天的內容將詳細介紹SVM這個算法的訓練過程以及他的主要優缺點&#xff0c;還沒有看過的小伙伴歡迎去補番&#xff1a;【五分鐘機器學習】向量支持機SVM——學霸中的…

java一維數組的復制

題目 使用簡單數組(1)創建一個名為ArrayTest的類&#xff0c;在main()方法中聲明array1和array2兩個變量&#xff0c;他們是int[]類型的數組。(2)使用大括號{}&#xff0c;把array1初始化為8個素數&#xff1a;2,3,5,7,11,13,17,19。(3)顯示array1的內容。(4)賦值array2變量等…

STL源碼剖析 數值算法 copy 算法

copy復制操作&#xff0c;其操作通過使用assignment operator 。針對使用trivial assignment operator的元素型別可以直接使用內存直接復制行為(使用C函數 memove或者memcpy)節約時間。還可以通過函數重載(function overloading)、型別特性(type traits)、偏特化(partial speci…

python輸入數字成數組_python – Numpy:將數值插入數組的最快方法,使得數組按順序排列...

假設我有一個數組my_array和一個奇異值my_val. (請注意,my_array始終排序). my_array np.array([1, 2, 3, 4, 5]) my_val 1.5 因為my_val是1.5,我想把它放在1和2之間,給我數組[1,1.5,2,3,4,5]. 我的問題是&#xff1a;當my_array任意增大時,生成有序輸出數組的最快方式(即以微…

java 一維數組的反轉

代碼 public class ReverseArray {public static void main(String[] args) {String[] str {"AA", "BB", "CC", "DD"};System.out.println(Arrays.toString(str));reverse1(str);System.out.println(Arrays.toString(str));reverse2…

STL源碼剖析 數值算法 copy_backward 算法

copy_backward 時間技巧和copy類似主要是將[first&#xff0c;last)區間范圍內的元素按照逆行方向復制到以result-1為起點&#xff0c;方向同樣是逆行的區間上返回的迭代器的類型是result - (last - first)copy_backward支持的類型必須是BidirectionalIterators &#xff0c;才…

java線性查找和二分查找

線性查找 package lesson.l7_array;/*** Illustration** author DengQing* version 1.0* datetime 2022/6/23 14:19* function 線性查找*/ public class LineSearch {public static void main(String[] args) {String[]str{"AA","BB","CC"};boo…

python開發web項目_Django2:Web項目開發入門筆記(20)

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓 這一篇教程&#xff0c;我們一起來了解如何在CentOS系統中將Django2的Web項目部署到Nginx服務器。 CentOS系統雖然和Ubuntu系統都是Linux系統&#xff0c;但是環境搭建和部署過程還是有一些區別。 整個流程分為幾個部分&#xff1…

STL源碼剖析 Set相關算法 并集 set_union|交集 set_intersection|差集 set_difference |對稱差集 set_symmetric_difference

注意事項 四種相關算法&#xff1a;并集、交集、差集、對稱差集本章的四個算法要求元素不可以重復并且經過了排序底層接受STL的set/multiset容器作為輸入空間不接受底層為hash_set和hash_multiset兩種容器 并集 set_union s1 U s2考慮到s1 和 s2中每個元素都不唯一&#xff0…

python sqlserver 數據操作_python對Excel數據進行讀寫操作

python對Excel數據進行讀寫操作將學習到的基礎操作記錄在這里&#xff0c;便與復習查看1.python讀取Excel工作簿、工作表import xlrd # 讀取工作簿 wbxlrd.open_workbook(招生表.xls) # 讀取工作簿下所有的工作表 wswb.sheets() # 讀取工作簿下所有工作表名稱 wsnamewb.sheet_n…

Arrays數組工具類

介紹 代碼 package lesson.l8_arrays;import java.util.Arrays;/*** Illustration** author DengQing* version 1.0* datetime 2022/6/23 16:53* function Arrays數組工具類*/ public class ArraysUtil {public static void main(String[] args) {int[] arr1 new int[]{1, 12…

通過解析URL實現通過Wifi的用戶查找

使用鏈接 遇見數據倉庫|遇見工具|IP地址精確查詢|WIFI精確查詢|在線語音識別|夢幻藏寶閣估價|福利資源|自定義導航-met.redhttps://sina.lt/ 操作步驟 打開第一個鏈接&#xff0c;點擊高精度IP定位&#xff0c;然后點擊右上角&#xff0c;創建一個Key&#xff0c;隨便輸入一…

anaconda中怎么sh_【好工具】 深度學習煉丹,你怎么能少了這款工具!JupyterLab 遠程訪問指南...

歡迎來到【好工具】專欄&#xff0c;本次我們給介紹一款可以進行遠程深度學習煉丹的工具 JupyterLab 及其配置流程&#xff0c;幫助讀者在本地進行調試&#xff0c;Max 開發效率。作者 & 編輯 | Leong導言不知道讀者們有沒有發現&#xff0c;如果你用 Anaconda 中的 Notebo…

java 類和對象 屬性和行為 成員變量和局部變量

概念 使用 案例 public class PersonText {public static void main(String[] args) {Person person new Person();person.name "dq";person.age 11;person.eat("番茄炒蛋");} }class Person {/*** 姓名*/String name;/*** 年齡*/Integer age;/*** 方…

STL源碼剖析 數值算法 heap算法

算法 adjacent_findcountcount_iffindfind_iffind_endfor_eachgenerategenerate_nincludesmax_elementmergemin_elementpartitionremoveremoveremove_copyremove_ifremove_copy_ifreplacereplace_copyreplace_ifreplace_copy_ifreversereverse_copyrotaterotate_copysearchsea…