文章目錄
- 一、基本概念
- 二、程序示例
- 1.遍歷
- 2. 查找
- 3. 排序、拷貝、替換
- 4. numeric相關算法
- 總結
一、基本概念
算法是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);//函數作為形參進行遍歷輸出for_each(L.begin(), L.end(), print);cout << endl;//仿函數進行遍歷for_each(L.begin(), L.end(), print1());cout << endl;//transform實現遍歷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;}//自定義數據類型需要重載==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;}//查找元素是否存在,無序序列結果未知bool i2 = binary_search(L.begin(), L.end(), 1);if (i2){cout << "查找到1" << endl;}else{cout << "未查找到" << endl;}//count統計int n = count(L.begin(), L.end(),1);cout << n << endl;//count_if統計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統計,需要重載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;}//自定義數據類型需要重載==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;//反轉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相關算法
#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");
}
總結
以上只是stl算法中常見的,后續會隨時補充新的算法。