C++STL总结笔记(三)—— 常见算法
生活随笔
收集整理的這篇文章主要介紹了
C++STL总结笔记(三)—— 常见算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 一、基本概念
- 二、程序示例
- 1.遍歷
- 2. 查找
- 3. 排序、拷貝、替換
- 4. numeric相關(guān)算法
- 總結(jié)
一、基本概念
算法是STL中很重要的一部分,其功能包括比較,查找,排序,交換,遍歷,復制等等。
最大的算法頭文件是algorithm,封裝了很多種模板類。還有numeric和functional也比較常見。
二、程序示例
1.遍歷
#include<iostream> #include<list> #include<algorithm> using namespace std;void print(int a) {cout << a << " "; }class print1 { public:void operator()(int a){cout << a << " ";} };class print2 { public:int operator()(int a){cout << a << " ";return a;} };void test() {list<int>L;L.push_back(1);L.push_back(2);L.push_back(3);//函數(shù)作為形參進行遍歷輸出for_each(L.begin(), L.end(), print);cout << endl;//仿函數(shù)進行遍歷for_each(L.begin(), L.end(), print1());cout << endl;//transform實現(xiàn)遍歷list<int>L1;L1.resize(L.size());transform(L.begin(),L.end(),L1.begin(), print2());}int main() {test();system("pause"); }2. 查找
#include<iostream> #include<list> #include<algorithm> using namespace std;class Compare { public://一元謂詞bool operator()(int a){return a > 1;} };class Cat { public:Cat(string name, int color, int age){this->Name = name;this->Color = color;this->Age = age;}//自定義數(shù)據(jù)類型需要重載==bool operator==(const Cat& cat){if (Name == cat.Name && Color == cat.Color && Age == cat.Age){return true;}else{return false;}}public:string Name;int Color;int Age; };class print1 { public:bool operator()(Cat& cat){return cat.Age > 3;} };void test() {list<int>L;L.push_back(1);L.push_back(2);L.push_back(3);//find算法查找list<int>::iterator i = find(L.begin(), L.end(), 1);if (i == L.end()){cout << "未查找到" << endl;}else{cout << "查找到" << *i<<endl;}//find_if查找list<int>::iterator i1 = find_if(L.begin(),L.end(),Compare());if (i1 == L.end()){cout << "未查找到" << endl;}else{cout << "查找到" << *i1 << endl;}//查找元素是否存在,無序序列結(jié)果未知bool i2 = binary_search(L.begin(), L.end(), 1);if (i2){cout << "查找到1" << endl;}else{cout << "未查找到" << endl;}//count統(tǒng)計int n = count(L.begin(), L.end(),1);cout << n << endl;//count_if統(tǒng)計int n1 = count_if(L.begin(), L.end(), Compare());cout << n1 << endl;}void test1() {list<Cat>L;Cat cat1("小100", 76, 2);Cat cat2("小200", 32, 2);Cat cat3("小300", 32, 4);Cat cat4("小400", 32, 3);Cat cat5("小500", 54, 1);//插入L.push_back(cat1);L.push_back(cat2);L.push_back(cat3);L.push_back(cat4);L.push_back(cat5);//find查找list<Cat>::iterator i = find(L.begin(), L.end(), cat1);if (i == L.end()){cout << "未查找到" << endl;}else{cout << "查找到" << (*i).Name << endl;}//find_if查找list<Cat>::iterator i1 = find_if(L.begin(), L.end(), print1());if (i1 == L.end()){cout << "未查找到" << endl;}else{cout << "查找到" << (*i1).Name << endl;}//查找相鄰的重復元素list<Cat>::iterator i2 = adjacent_find(L.begin(), L.end());if (i2 == L.end()){cout << "未查找到" << endl;}else{cout << "查找到" << (*i2).Name << endl;}Cat cat6("小300", 32, 4);//count統(tǒng)計,需要重載int n = count(L.begin(), L.end(), cat6);cout << n << endl; }int main() {test1();system("pause"); }3. 排序、拷貝、替換
#include<iostream> #include<vector> #include<algorithm> #include<ctime> using namespace std;class Compare { public://一元謂詞bool operator()(int a,int b){return a > b;} };class Compare3 { public://一元謂詞bool operator()(int a){return a > 3;} };void print(int a) {cout << a << " "; }class Cat { public:Cat(string name, int color, int age){this->Name = name;this->Color = color;this->Age = age;}//自定義數(shù)據(jù)類型需要重載==bool operator==(const Cat& cat){if (Name == cat.Name && Color == cat.Color && Age == cat.Age){return true;}else{return false;}}public:string Name;int Color;int Age; };void test() {vector<int>L;L.push_back(1);L.push_back(2);L.push_back(3);L.push_back(4);//降序sort(L.begin(), L.end(),Compare());for_each(L.begin(), L.end(), print);cout << endl;//greater<int>()sort(L.begin(), L.end(),greater<int>());for_each(L.begin(), L.end(), print);cout << endl;sort(L.begin(), L.end());//隨機打亂//srand((unsigned int)time(NULL));//random_shuffle(L.begin(), L.end());//for_each(L.begin(), L.end(), print);//cout << endl;vector<int>L1(L);vector<int>L2;L2.resize(L.size()+L1.size());//合并,默認只能同為升序的合并merge必須為有序序列merge(L.begin(), L.end(), L1.begin(), L1.end(),L2.begin());for_each(L2.begin(), L2.end(), print);cout << endl;//反轉(zhuǎn)reverse(L.begin(), L.end());for_each(L.begin(), L.end(), print);cout << endl;//拷貝vector<int>L3;L3.resize(L.size());copy(L.begin(), L.end(), L3.begin());for_each(L3.begin(), L3.end(), print);cout << endl;//替換replace(L.begin(), L.end(), 2, 5);for_each(L.begin(), L.end(), print);cout << endl;replace_if(L.begin(), L.end(), Compare3(),20);for_each(L.begin(), L.end(), print);cout << endl;//互換swap(L, L1); }int main() {test();system("pause"); }4. numeric相關(guān)算法
#include<iostream> #include<vector> #include<numeric> #include<algorithm> #include<ctime> using namespace std;void print(int a) {cout << a << " "; }void test() {vector<int>L;L.push_back(1);L.push_back(2);L.push_back(3);L.push_back(4);//計算容器元素的和,0為起始累加值int total = accumulate(L.begin(), L.end(), 0);cout << total<<endl;//填充元素vector<int>L1;L1.resize(L.size());fill(L1.begin(), L1.end(), 3);for_each(L1.begin(), L1.end(), print);cout << endl;//求交集vector<int>L2;L2.resize(min(L.size(),L1.size()));vector<int>::iterator i = set_intersection(L.begin(), L.end(), L1.begin(), L1.end(), L2.begin());for_each(L2.begin(), i, print);cout << endl;//求并集vector<int>L3;L3.resize(L.size()+ L1.size());vector<int>::iterator j = set_union(L.begin(), L.end(), L1.begin(), L1.end(), L3.begin());for_each(L3.begin(), j, print);cout << endl;//差集vector<int>L4;L4.resize(max(L.size() , L1.size()));vector<int>::iterator j1 = set_difference(L.begin(), L.end(), L1.begin(), L1.end(), L4.begin());for_each(L4.begin(), j1, print); }int main() {test();system("pause"); }總結(jié)
以上只是stl算法中常見的,后續(xù)會隨時補充新的算法。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的C++STL总结笔记(三)—— 常见算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01-SA8155P Flat Buil
- 下一篇: C++总结笔记(十二)—— 智能指针