什麼是stl算法
操作stl集合的一堆方法。很方便,他們就是一堆工具。
你只要熟悉stl就可以很方便的使用他們啦。
先明白算法有哪些,有什麼作用,然後熟悉一部分常用的,其他的在實踐中時候用
stl算法的分類
非變序算法
計數算法 count,count_if 搜索算法 search,seach_n find,find_if,find_end,find_first_of,adjacent_find 比較算法 equal,mismatch,lexicographical_compare
變序算法
初始化算法 fill,fill_n,generate,generate_n 修改算法 for_each,transform 復制算法 copy,copy_backward 刪除算法 remove,reomve_if,remove_copy,remove_copy_if unique,unique_copy 替換算法 replace,replace_if 排序算法 sort,stab_sort,partial_sort 分區算法 partion,stable_partition 可用於排序容器的算法 binary_search,lower_bound,upper_bound
stl算法的應用
計算元素的個數 查找元素 在集合中搜索元素或序列 將容器中的元素初始化為指定的值 使用for_each處理范圍內的元素 使用transtrom 對范圍進行編號 復制和刪除操作 替換值以及滿足給定條件的元素 排序,在有序集合中搜索以及刪除重復元素 將范圍分區 在有序集合中插入元素
// // main.cpp // use_stl_algorithm // // Created by bikang on 16/11/1. // Copyright (c) 2016年 bikang. All rights reserved. // #include#include #include #include using namespace std; template
class PrintClass { public: void operator()(const T& elem)const{ cout << elem << " "; } }; template bool isEven(const T& number) { return ((number%2) == 0); } template T addData(const T & v1,const T & v2) { return (v1+v2); } //在容器中計算元素個數和查找元素 void tstlalg1(); //查找序列 void tsearch(); //容器初始化fill 偏移范圍 fill_n 開始位置,個數,數值 //generate隨機初始化 void tfill(); //transform 容器的內容的變換 void ttransform(); //測試復制和刪除 //copy,copy_backward,remove,remove_if //replace //partition stable_partition void tdelCopy(); //sort binary_search unique 排序 查找 去重復 void tsort(); int main(int argc, const char * argv[]) { //tstlalg1(); //tsearch(); //tfill(); //ttransform(); //tdelCopy(); tsort(); return 0; } void tsort(){ vector vec1; vec1.push_back("tom"); vec1.push_back("tim"); vec1.push_back("tim"); vec1.push_back("tam"); vec1.push_back("tam"); vec1.push_back("kim"); vec1.push_back("kim"); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //排序 sort(vec1.begin(), vec1.end()); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //查找 bool searchRes = binary_search(vec1.begin(), vec1.end(), "tom"); if(searchRes){ cout << "find ok"< ());cout << endl; vec1.erase(ite, vec1.end()); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //有序插入,優選的最前和最靠後的位置 string lowerStr = "ad"; ite = lower_bound(vec1.begin(), vec1.end(),lowerStr); vec1.insert(ite, lowerStr); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; string upperStr = "ss"; ite = upper_bound(vec1.begin(), vec1.end(),upperStr); vec1.insert(ite, upperStr); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; } void tdelCopy(){ list l1; for(int j =0;j<10;++j){ l1.push_back(j); } for_each(l1.begin(), l1.end(), PrintClass ());cout << endl; //copy vector vec1(l1.size() *2); vector ::iterator ite; ite = copy(l1.begin(), l1.end(),vec1.begin()); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; copy_backward(l1.begin(), l1.end(), vec1.end()); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //remove remove(vec1.begin(), vec1.end(), 0); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //remove if remove_if(vec1.begin(), vec1.end(), [](int i){return i%2==0;}); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //replace replace(vec1.begin(), vec1.end(), 1, 21); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //replace if replace_if(vec1.begin(), vec1.end(), [](int i){return i%2==1;}, 55); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //partition partition(l1.begin(), l1.end(),[](int i){return i%2==1;}); for_each(l1.begin(), l1.end(), PrintClass ());cout << endl; //stable_partition stable_partition(l1.begin(), l1.end(),[](int i){return i%2==1;}); for_each(l1.begin(), l1.end(), PrintClass ());cout << endl; } void ttransform(){ string str1 = "this is a simple language!"; string str1low; str1low.resize(str1.size()); transform(str1.begin(), str1.end(), str1low.begin(), (int(*)(int))toupper); cout << str1low << endl; //測試加法 vector vec1; for (int i =0; i<10; ++i) { vec1.push_back(i); } vector vec2; for (int i =20; i<30; ++i) { vec2.push_back(i); } vector res; res.resize(10); //兩個容器的內容相加 transform(vec1.begin(), vec1.end(), vec2.begin(), res.begin(), addData ); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; for_each(vec2.begin(), vec2.end(), PrintClass ());cout << endl; for_each(res.begin(), res.end(), PrintClass ());cout << endl; } void tfill(){ cout << "tfill" << endl; vector vec1(3); fill(vec1.begin(), vec1.end(), 9); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; vec1.resize(6); fill_n(vec1.begin()+3, 3, 3); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; vec1.resize(10); generate(vec1.begin()+6, vec1.end(), rand); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; vec1.resize(12); generate_n(vec1.begin()+10, 2, rand); for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; } void tsearch(){ cout << "tsearch" << endl; vector vec1; for (int i =0; i<10; ++i) { vec1.push_back(i); } for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; list l1; for(int j =3;j<5;++j){ l1.push_back(j); } //search查找 vector ::iterator ite; ite = search(vec1.begin(), vec1.end(),l1.begin(), l1.end()); if(ite != vec1.end()){ cout << "pos=" << distance(vec1.begin(), ite); }else{ cout << " search faild"; } } void tstlalg1(){ cout << "start" << endl; vector vec1; for (int i =0; i<10; ++i) { vec1.push_back(i); } for_each(vec1.begin(), vec1.end(), PrintClass ());cout << endl; //查找 數據數量 long numCount = 0; int find_data = 3; numCount = count(vec1.begin(), vec1.end(), (int)find_data); cout << "numCount=" < ); cout << "npos=" < ::iterator ite; ite = find(vec1.begin(), vec1.end(), find_data); if(ite != vec1.end()){ cout << find="" ok="" ite="" pre="">