4.5 常用排序算法
/* merge算法 容器元素合并,并存储到另一容器中 @param beg1 容器1开始迭代器 @param end1 容器1结束迭代器 @param beg2 容器2开始迭代器 @param end2 容器2结束迭代器 @param dest 目标容器开始迭代器 */ merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) /* sort算法 容器元素排序 注意:两个容器必须是有序的 @param beg 容器1开始迭代器 @param end 容器1结束迭代器 @param _callback 回调函数或者谓词(返回bool类型的函数对象) */ sort(iterator beg, iterator end, _callback) /* sort算法 对指定范围内的元素随机调整次序 @param beg 容器开始迭代器 @param end 容器结束迭代器 */ random_shuffle(iterator beg, iterator end) /* reverse算法 反转指定范围的元素 @param beg 容器开始迭代器 @param end 容器结束迭代器 */ reverse(iterator beg, iterator end) |
17 常用排序算法
merge 算法 容器元素合并,并存储到另一个容器中,两容器要有序,并且顺序一致
sort 排序算法比较常用 这是重点
random_shuffle 洗牌算法 自己需要提供随机数种子,这个也很重要
reverse 反转 并不是排序
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <ctime>
using namespace std;
/*
merge算法 容器元素合并,并存储到另一容器中,这两个容器必须有序且顺序相同
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器
*/
//merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
void test01(){
vector<int>v1;
vector<int>v2;
for(int i=0;i<10;i++){
v1.push_back(i);
v2.push_back(i+1);
}
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(),[](int v){cout<<v<<endl;});
}
/*
sort算法 容器元素排序
注意:两个容器必须是有序的
@param beg 容器1开始迭代器
@param end 容器1结束迭代器
@param _callback 回调函数或者谓词(返回bool类型的函数对象)
*/
//sort(iterator beg, iterator end, _callback)
bool myCom(int v1,int v2){
return v1>v2;
}
void test02(){
vector<int>v1;
v1.push_back(10);
v1.push_back(3);
v1.push_back(34);
v1.push_back(23);
sort(v1.begin(),v1.end());
for_each(v1.begin(),v1.end(),[](int v){cout<<v<<endl;});
cout<<"---------------------------"<<endl;
sort(v1.begin(),v1.end(),greater<int>());
// sort(v1.begin(),v1.end(),myCom);
// sort(v1.begin(),v1.end(),[](int v1,int v2){return v1>v2;});
for_each(v1.begin(),v1.end(),[](int v){cout<<v<<endl;});
}
/*
sort算法 对指定范围内的元素随机调整次序
@param beg 容器开始迭代器
@param end 容器结束迭代器
*/
//random_shuffle(iterator beg, iterator end)//洗牌算法
void test03(){
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(),[](int v){cout<<v<<endl;});
//随机算法
//加随机种子
//比较实用
}
/*
reverse算法 反转指定范围的元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
*/
//reverse(iterator beg, iterator end)
void test04(){
vector<int>v;
for(int i=0;i<10;i++){
v.push_back(i);
}
reverse(v.begin(),v.end());
for_each(v.begin(),v.end(),[](int v){cout<<v<<endl;});
}
int main(){
srand((unsigned int)time(NULL));
//test01();
//test02();
//test03();
test04();
system("pause");
return 0;
}
4.6 常用拷贝和替换算法
/* copy算法 将容器内指定范围的元素拷贝到另一容器中 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param dest 目标起始迭代器 */ copy(iterator beg, iterator end, iterator dest) /* replace算法 将容器内指定范围的旧元素修改为新元素 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param oldvalue 旧元素 @param oldvalue 新元素 */ replace(iterator beg, iterator end, oldvalue, newvalue) /* replace_if算法 将容器内指定范围满足条件的元素替换为新元素 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param callback函数回调或者谓词(返回Bool类型的函数对象) @param oldvalue 新元素 */ replace_if(iterator beg, iterator end, _callback, newvalue) /* swap算法 互换两个容器的元素 @param c1容器1 @param c2容器2 */ swap(container c1, container c2) |
18 常用的拷贝和替换算法
copy 复制
replace replace_if 替换 比较常用
swap 交换
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>//流迭代器
using namespace std;
/*
copy算法 将容器内指定范围的元素拷贝到另一容器中
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param dest 目标起始迭代器
*/
//copy(iterator beg, iterator end, iterator dest)
void test01(){
vector<int>v;
for(int i=0;i<10;i++){
v.push_back(i);
}
vector<int>vTarget;
vTarget.resize(v.size());
copy(v.begin(),v.end(),vTarget.begin());
for_each(vTarget.begin(),vTarget.end(),[](int val){cout<<val<<endl;});
//高端操作
copy(vTarget.begin(),vTarget.end(),ostream_iterator<int>(cout," "));//流迭代器
}
/*
replace算法 将容器内指定范围的旧元素修改为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param oldvalue 旧元素
@param oldvalue 新元素
*/
//replace(iterator beg, iterator end, oldvalue, newvalue)
/*
replace_if算法 将容器内指定范围满足条件的元素替换为新元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param callback函数回调或者谓词(返回Bool类型的函数对象)
@param oldvalue 新元素
*/
//replace_if(iterator beg, iterator end, _callback, newvalue)
class myCom{
public:
bool operator()(int v){
return v>3;//将大于3的数替换成一个什么样的数
}
};
void test02(){
vector<int>v;
for(int i=0;i<10;i++){
v.push_back(i);
}
//需求:把容器中的3替换成300
replace(v.begin(),v.end(),3,300);
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));//流迭代器
//需求 : 把容器中所有大于3的数字 都替换成300
replace_if(v.begin(),v.end(),myCom(),3000);
cout<<endl;
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));//流迭代器
}
/*
swap算法 互换两个容器的元素
@param c1容器1
@param c2容器2
*/
//swap(container c1, container c2)
void test03(){
vector<int>v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
vector<int>v2;
v2.push_back(10);
v2.push_back(20);
v2.push_back(20);
v2.push_back(40);
cout<<"交换前数据"<<endl;
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
cout<<endl;
copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
swap(v1,v2);
cout<<"交换后数据"<<endl;
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
cout<<endl;
copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
swap(v1,v2);
}
int main(){
//test01();
// test02();
test03();
return 0;
}
(本笔记内容整理自网络资源,侵删)