常用排序算法
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替换成2000
replace(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替换为3000
replace_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");
}