常用排序算法
sort
功能描述:对容器内元素进行排序函数原型:sort(iterator beg, iterator end, _Pred) ;// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置// beg 开始迭代器// end 结束迭代器// _Pred 谓词
sort属于开发中最常用的算法之一,需熟练掌握
代码实现
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
//sort(iterator beg, iterator end, _Pred); 第三个元素谓词可加不加,不加为默认
using namespace std;
void print(int val){cout<<val<<" ";
}
//bool Greater20(int val,int val2)//再次证明普通函数完全可以替代仿函数,但是其类型要一样,具体参考for_each案例和
count_if案例
//{
// return val>val2;
//}
void test01(){vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);//利用sort进行升序sort(v.begin(),v.end());for_each(v.begin(),v.end(),print); cout<<endl;// 改变为降序
// sort(v.begin(),v.end(),Greater20);sort(v.begin(),v.end(),greater<int>());//内建函数对象 for_each(v.begin(),v.end(),print);//逆向输出//三种输出方法
}
int main()
{test01();system("pause");
}
再次证明普通函数完全可以替代仿函数,但是其类型要一样,具体参考for_each案例和count_if案例
random_shuffle
功能描述:洗牌 指定范围内的元素随机调整次序函数原型:random_shuffle(iterator beg, iterator end) ;// 指定范围内的元素随机调整次序// beg 开始迭代器// end 结束迭代器
//利用洗牌算法打乱顺序
random_shuffle(v.begin(),v.end());
for_each(v.begin(),v.end(),print());再加上随机种子实现乱序
代码实现
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
#include<ctime>
using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};void test01(){vector<int>v;for(int i=0;i<10;i++){v.push_back(i);}//利用洗牌算法打乱顺序random_shuffle(v.begin(),v.end());for_each(v.begin(),v.end(),print());}
int main()
{srand((unsigned int)time(NULL));//经典随机种子 test01();system("pause");
}
总结:random_shuffle洗牌算法比较实用,使用时记得加随机数种子
merge
功能描述:两个容器元素合并,并存储到另一容器中函数原型:merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) ;// 容器元素合并,并存储到另一容器中// 注意: 两个容器必须是有序的 合并后还是有序序列// beg1 容器 1 开始迭代器 // end1 容器 1 结束迭代器 // beg2 容器 2 开始迭代器 // end2 容器 2 结束迭代器 //dest 目标容器 开始 迭代器
代码实现
#include <iostream>
#include<vector>
#include<algorithm>
// 容器元素合并,并存储到另一容器中
// 注意: 两个容器必须是有序的
// beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
//dest 目标容器开始迭代器
//有意思是合并后还是有序序列
using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};
void test01(){vector<int>v1;vector<int>v2;for(int i=0;i<10;i++){v1.push_back(i);v2.push_back(i+5);}//目标容器vector<int>vTarget;//此时要给目标容器分配空间vTarget.resize(v1.size()+v2.size()); merge(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());for_each(vTarget.begin(),vTarget.end(),print());
}
int main()
{test01();system("pause");
}
实现
如图所示 合并后还是有序序列
reverse
功能描述:将容器内元素进行反转函数原型:reverse(iterator beg, iterator end) ;// 反转指定范围的元素// beg 开始迭代器 //end 结束迭代器
代码实现
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};
void test01(){vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);cout<<"反转前:"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;cout<<"反转后:"<<endl;reverse(v.begin(),v.end());for_each(v.begin(),v.end(),print());
}
int main()
{test01();system("pause");
}
常用拷贝和替换算法
copy
vector<int>v2(v1);//也可以直接拷贝,不用算法赋空间 也可等号赋值 (具体见前面的容器总结)
功能描述:容器内指定范围的元素拷贝到另一容器中函数原型:copy(iterator beg, iterator end, iterator dest) ;// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置// beg 开始迭代器// end 结束迭代器// dest 目标起始迭代器
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};
void test01(){vector<int>v1;for(int i=0;i<10;i++){v1.push_back(i);}
// vector<int>v2(v1);//也可以直接拷贝,不用算法 也可等号赋值 vector<int>v2;//设置内存空间 v2.resize(v1.size());copy(v1.begin(),v1.end(),v2.begin());for_each(v2.begin(),v2.end(),print());}
int main()
{test01();system("pause");
}
replace
功能描述:将容器内指定范围的旧元素修改为新元素函数原型:replace(iterator beg, iterator end, oldvalue, newvalue) ;// 将区间内旧元素 替换成 新元素// beg 开始迭代器// end 结束迭代器// oldvalue 旧元素// newvalue 新元素
简单,没什么说的,直接放代码
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};
//replace(iterator beg, iterator end, oldvalue, newvalue);
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器
// end 结束迭代器
// oldvalue 旧元素
// newvalue 新元素
void test01(){vector<int>v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(50);v.push_back(20);v.push_back(60);v.push_back(20);v.push_back(70);cout<<"替换前"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;//将20替换成2000replace(v.begin(),v.end(),20,2000); cout<<"替换后"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;
}
int main()
{test01();system("pause");
}
replace_if
功能描述 :将区间内 满足条件 的元素,替换成指定元素函数原型:replace_if(iterator beg, iterator end, _pred, newvalue) ;// 按条件替换元素,满足条件的替换成指定元素// beg 开始迭代器// end 结束迭代器// _pred 谓词 (bool)// newvalue 替换的新元素
代码如下
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
using namespace std;
//谓词 返回bool类型
class Greater30{public:bool operator()(int val){return val>=30;}
};class print//仿函数
{public:void operator()(int val){cout<<val<<" ";}
};
void test01(){vector<int>v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(50);v.push_back(20);v.push_back(60);v.push_back(20);v.push_back(70);cout<<"替换前"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;//将大于等于30替换为3000replace_if(v.begin(),v.end(),Greater30(),3000);//34为替换条件和替换值 for_each(v.begin(),v.end(),print());cout<<endl;}
int main()
{test01();system("pause");
}
swap
功能描述:互换两个容器的元素函数原型:swap(container c1, container c2) ;// 互换两个容器的元素// c1 容器 1// c2 容器 2直接写两个容器
代码如下
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
void print(int val){cout<<val<<" ";
}
void test01(){vector<int>v1;vector<int>v2;for(int i=0;i<10;i++){v1.push_back(i);v2.push_back(i+100); } cout<<"交换前:"<<endl;for_each(v1.begin(),v1.end(),print);cout<<endl;for_each(v2.begin(),v2.end(),print);cout<<endl;cout<<"-----------------------------------"<<endl;cout<<"交换后:"<<endl;swap(v1,v2);for_each(v1.begin(),v1.end(),print);cout<<endl;for_each(v2.begin(),v2.end(),print);cout<<endl;
}
int main()
{test01();system("pause");
}