算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
STL中算法大致分为四类:
1)非可变序列算法:指不直接修改其所操作的容器内容的算法。
2)可变序列算法:指可以修改它们所操作的容器内容的算法。
3)排序算法:对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
4)数值算法:对容器内容进行数值计算。
以下对所有算法进行细致分类、标明功能并且实现:
#define SIZE 1000
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#include<string>
#include<numeric>
using namespace std;
/***************************************1.查找*************************************************/
//在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator,否则返回last
void Fadjacent_find(vector<int>vec){
vec.push_back(999);
vector<int>::iterator it=adjacent_find(vec.begin(),vec.end());
cout<<"The adjacent_find result:"<<*it<<endl;
}
//在有序序列中查找value,找到返回true
void Fbinary_search(vector<int>vec,int value){
bool result=binary_search(vec.begin(),vec.end(),value);
cout<<"The binary_search result:"<<result<<endl;
}
//利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。
void Fcount(vector<int>vec,int value){
int result=count(vec.begin(),vec.end(),value);
cout<<"The count result:"<<result<<endl;
}
//利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数
bool cmp1(int num){
return num%1000;
}
void Fcount_if(vector<int>vec){
int result=count_if(vec.begin(),vec.end(),cmp1);
cout<<"The count_if result:"<<result<<endl;
}
//功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound
void Fequal_range(vector<int>vec,int value){
pair<vector<int>::iterator,vector<int>::iterator> result=equal_range(vec.begin(),vec.end(),value);
cout<<"The equal_range result:"<<*result.first<<" "<<*result.second<<endl;
}
//利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的Iterator
void Ffind(vector<int>vec,int value){
vector<int>::iterator result=find(vec.begin(),vec.end(),value);
cout<<"The find result:"<<&*result<<endl;
}
//在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一个ForwardIterator,
//否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。
void Ffind_end(){
string str="aacaabbcddefacss";
string substr="ac";
string::iterator result=find_end(str.begin(),str.end(),substr.begin(),substr.end());
for(int i=0;i<str.length();i++){
cout<<&str[i]<<" is: "<<str[i]<<endl;
}
cout<<"The find_end result:"<<&*result<<" is: "<<*result<<endl;
}
//在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。
//第一个序列中的元素第一次出现在第二个序列中的元素
void Ffind_first_of(){
string str="mnblkjhgfdsac";
string substr="ca";
string::iterator result=find_first_of(str.begin(),str.end(),substr.begin(),substr.end());
cout<<"The find_first_of result:"<<*result<<endl;
}
//它接收一个函数对象的参数作为参数,并使用它来做更复杂的评价对象是否和给出的查找条件相符。
bool cmp2(int value){
return value>=996;
}
void Ffind_if(vector<int>vec){
vector<int>::iterator result=find_if(vec.begin(),vec.end(),cmp2);
cout<<"The find_if result:"<<*result<<endl;
}
//返回的是第一个不小于给定元素value的位置
void Flower_bound(vector<int>vec,int value){
vector<int>::iterator result=lower_bound(vec.begin(),vec.end(),value);
cout<<"The lower_bound result:"<<*result<<endl;
}
//返回的是第一个大于给定元素value的位置
void Fupper_bound(vector<int>vec,int value){
vector<int>::iterator result=upper_bound(vec.begin(),vec.end(),value);
cout<<"The upper_bound result:"<<*result<<endl;
}
//search算法在一个序列中找另一个序列的第一次出现的位置
void Fsearch(){
string str="mnblkjhgfdsca";
string substr="ca";
string::iterator result=search(str.begin(),str.end(),substr.begin(),substr.end());
cout<<"The search result:"<<*result<<endl;
}
//search_n
bool cmp3(int i,int j){
return i==j;
}
void Fsearch_n(){
int array[]={1,996,996,996,5,5,996,996,6,6,6,7,8,8,9,10};
vector<int>vec(array,array+16);
//search_n(s,e,cnt,num);找区间内[s,e)连续cnt个的num返回的是找到的第一个num的迭代器
vector<int>::iterator result=search_n(vec.begin(),vec.end(),2,996);
for(int i=0;i<vec.size();i++){
cout<<"vec["<<i<<"].address:"<<&vec[i]<<" "<<"the num is:"<<vec[i]<<endl;
}
cout<<"The first search_n result:"<<&*result<<" "<<*result<<endl;
//search_n(s,e,cnt,num,cmp);找区间内[s,e)连续cnt个的num符合cmp()条件的,返回的是找到的第一个num的迭代器
result=search_n(vec.begin(),vec.end(), 3, 996, cmp3);
cout<<"The second search_n result:"<<&*result<<" "<<*result<<endl;
}
/***************************************2.排序*************************************************/
//inplace_merge(vi.begin(),vi.begin()+5,vi.end()),第一个参数为起始,最后一个为末尾,中间为第一个有序序列的元素个数
void Finplace_merge(){
vector<int> vi{1,5,8,19,200,1,8,56,74,91,100,101,102,103};
cout<<"before inplace_merge,vi=";
for_each(vi.begin(),vi.end(),[](int i){cout<<i<<" ";});
cout<<endl;
inplace_merge(vi.begin(),vi.begin()+5,vi.end());
cout<<"after inplace_merge,vi=";
for_each(vi.begin(),vi.end(),[](int i){cout<<i<<" ";});
cout<<endl;
}
/**merge函数的作用是:将两个已经排好序的序列合并为一个有序的序列。
* 函数参数:merge(first1,last1,first2,last2,result,compare);
* firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器;
* first2为第二个容器的首迭代器,last2为容器的末迭代器;
* result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。
*/
bool cmp4(int iter1,int iter