//不可变序列算法示例
#include<iostream>
#include<algorithm>
#include<functional>
#include<vector>
using namespace std;
int main(){
int iarray[]={0,1,2,3,4,5,6,6,6,7,8};
vector<int>ivector(iarray,iarray+sizeof(iarray)/sizeof(int));
int iarray1[]={6,6};
vector<int>ivector1(iarray1,iarray1+sizeof(iarray1)/sizeof(int));
int iarray2[]={4,6};
vector<int>ivector2(iarray2,iarray2+sizeof(iarray2)/sizeof(int));
int iarray3[]={0,1,2,3,4,5,7,7,7,9,7};
vector<int>ivector3(iarray3,iarray3+sizeof(iarray3)/sizeof(int));
cout<<*adjacent_find(ivector.begin(),ivector.end())<<endl;
//找出相邻元素值相等的第一个元素
cout<<count_if(ivector.begin(),ivector.end(),bind2nd(less<int>(),7))<<endl;
//找出小于7的元素个数
cout<<*find_if(ivector.begin(),ivector.end(),bind2nd(greater<int>(),2))<<endl;
//找出大于2的第一个元素
cout<<*search(ivector.begin(),ivector.end(),ivector2.begin(),ivector2.end())<<endl;
//子序列ivector2在ivector中出现的起点位置元素 未出现返回0
cout<<*search_n(ivector.begin(),ivector.end(),3,6,equal_to<int>())<<endl;
//查找连续出现3个6的起点位置元素
cout<<equal(ivector.begin(),ivector.end(),ivector3.begin())<<endl;
//判断两个区间相等否
return 0;
}
//可变序列算法示例
#include<iostream>
#include<algorithm>
#include<functional>
#include<iterator>
#include<vector>
using namespace std;
class evenByTwo{
private:
int x;
public:
evenByTwo():x(0){
}
int operator()(){
return x+=2;
}
};
int main(){
int iarray1[]={0,1,2,3,4,4,5,5,6,6,6,6,6,7,8};
int iarray2[]={0,1,2,3,4,5,6,6,6,7,8};
vector<int>ivector1(iarray1,iarray1+sizeof(iarray1)/sizeof(int));
vector<int>ivector2(iarray2,iarray2+sizeof(iarray2)/sizeof(int));
vector<int>ivector3(4);//4个元素
ostream_iterator<int>output(cout," ");//output输出
vector<int>ivector4;
remove_copy(ivector2.begin(),ivector2.end(),back_inserter(ivector4),6);
//将删除元素6后的vector2序列置于另一个容器vector4之中
copy(ivector4.begin(),ivector4.end(),output);
cout<<endl;
ivector2.erase(remove_if(ivector2.begin(),ivector2.end(),bind2nd(less<int>(),6)),ivector2.end());
//删除小于6的元素:remove_if实现逻辑删除,指针指向初始位置,erase实施真正的物理删除
copy(ivector2.begin(),ivector2.end(),output);
cout<<endl;
replace(ivector2.begin(),ivector2.end(),6,3);
copy(ivector2.begin(),ivector2.end(),output);
cout<<endl;
reverse(ivector2.begin(),ivector2.end());
copy(ivector2.begin(),ivector2.end(),output);
cout<<endl;
rotate_copy(ivector2.begin(),ivector2.begin()+3,ivector2.end(),output);
//旋转(互换元素)将[first,middle)和[middle,end)中的元素互换并输出结果
cout<<endl;
//迭代遍历ivector3区间,每个元素设为-1
fill(ivector3.begin(),ivector3.end(),-1);
copy(ivector3.begin(),ivector3.end(),output);//使用copy进行输出
cout<<endl;
//迭代遍历ivector3区间,对每一个元素进行evenByTwo操作
generate(ivector3.begin(),ivector3.end(),evenByTwo());
copy(ivector3.begin(),ivector3.end(),output);
cout<<endl;
return 0;
}
/*
0 1 2 3 4 5 7 8
6 6 6 7 8
3 3 3 7 8
8 7 3 3 3
3 3 8 7 3
-1 -1 -1 -1
2 4 6 8
*/
#include<iostream>
#include<algorithm>
#include<functional>
#include<iterator>
#include<vector>
using namespace std;
int main(){
int iarray[8]={26,38,15,22,23,32,40,33};
vector<int>ivector(iarray,iarray+8);
//查找并输出第一个最大值元素及其位置
vector<int>::iterator p =max_element(ivector.begin(),ivector.end());
int n=p-ivector.begin();//得到下标
cout<<"max element: "<<*p<<"found at "<<n<<endl;
//局部排序并复制到别处
vector<int> ivector1(5);
partial_sort_copy(ivector.begin(),ivector.begin()+6,ivector1.begin(),ivector1.end());
copy(ivector1.begin(),ivector1.end(),ostream_iterator<int>(cout," "));
cout<<endl;
sort(ivector.begin(),ivector.end());
copy(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//返回小于等于24和大于等于24的元素的位置
cout<<*lower_bound(ivector.begin(),ivector.end(),22)<<endl;
//lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个不小于value 的值
//从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。
cout<<*upper_bound(ivector.begin(),ivector.end(),22)<<endl;
//二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。
//二分查找 存在返回1
cout<<binary_search(ivector.begin(),ivector.end(),33)<<endl;
return 0;
}
#include<iostream>
#include<algorithm>
#include<functional>
#include<iterator>
#include<vector>
using namespace std;
int main(){
int iarray[8]={26,38,15,22,23,32,40,33};
int iarray1[8]={72,22,30,40,5};
vector<int>ivector(iarray,iarray+8);
vector<int>ivector1(iarray1,iarray1+5);
//合并两个序列 并将结果放入ivector2中
vector<int>ivector2(13);
merge(ivector.begin(),ivector.end(),ivector1.begin(),ivector1.end(),ivector2.begin()) ;
copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//a[5]左边全小于它 右边全大于它
nth_element(ivector2.begin(),ivector2.begin()+5,ivector2.end());
//排序并保持原来相对位置
copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
stable_sort(ivector2.begin(),ivector2.end());
//合并两个有序序列,然后就地替换
copy(ivector2.begin(),ivector2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
int iarray3[8]={1,3,5,7,2,4,6,8};
vector<int>ivector3(iarray3,iarray3+8);
inplace_merge(ivector3.begin(),ivector3.begin()+4,ivector3.end()) ;
copy(ivector3.begin(),ivector3.end(),ostream_iterator<int>(cout," "));
cout<<endl;
return 0;
}
#include<iostream>
#include<iterator>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
struct Person{
string name;
int age;
string favoriteColor;
};
ostream &operator<<(ostream &out,Person person){
out<<"name:"<<person.name;
out<<",age:"<<person.age;
out<<",name:"<<person.favoriteColor;
out<<endl;
return out;
}
bool sortByName(const Person &lhs,const Person &rhs){
return lhs.name<rhs.name;
}
bool sortByAge(const Person &lhs,const Person &rhs){
return lhs.age<rhs.age;
}
bool sortByColor(const Person &lhs,const Person &rhs){
return lhs.favoriteColor<rhs.favoriteColor;
}
int main(){
const unsigned numberOfPeople=3;
vector<Person> people(numberOfPeople);
for(vector<Person>::size_type i=0;i!=numberOfPeople;++i){
cin>>people[i].name;
cin>>people[i].age;
cin>>people[i].favoriteColor;
}
cout<<endl;
sort(people.begin(),people.end(),sortByName);
copy(people.begin(),people.end(),ostream_iterator<Person>(cout," "));
cout<<endl;
sort(people.begin(),people.end(),sortByAge);
copy(people.begin(),people.end(),ostream_iterator<Person>(cout," "));
cout<<endl;
sort(people.begin(),people.end(),sortByColor);
copy(people.begin(),people.end(),ostream_iterator<Person>(cout," "));
cout<<endl;
}
#include<iostream>
#include<numeric>
#include<functional>
#include<iterator>
#include<vector>
using namespace std;
int main(){
int iarray[]={1,2,3,4,5};
vector<int> ivector(iarray,iarray+sizeof(iarray)/sizeof(int));
cout<<accumulate(ivector.begin(),ivector.end(),0)<<endl;
//内积
cout<<inner_product(ivector.begin(),ivector.end(),ivector.begin(),10)<<endl;
//局部求和
partial_sum(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//相邻元素差值
adjacent_difference(ivector.begin(),ivector.end(),ostream_iterator<int>(cout," "));
cout<<endl;
return 0;
}
/*
15
65
1 3 6 10 15
1 1 1 1 1
*/