STL常用排序合并算法

/*
//必须有序的才行
merge 算法 容器元素合并,并存储到另一个容器里
beg1, end1, beg2, end2, dest 目标容器开始迭代器
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);


//打乱排序
random_shuffle(iterator beg, iterator end);


//翻转容器
reverse(iterator beg, iterator end);
*/


# include <iostream>
# include <vector>
# include <algorithm>
# include <cstdlib>
# include <ctime>
# include <map>
# include <functional>
# include <list>


using namespace std;




struct MyPrint01
{
void operator()(int val)
{
cout << val << " ";
}
};


struct MyCompare01
{
bool operator()(int v1, int v2)
{
//从大到小
return v1 > v2;
}
};


//merge
void test01()
{
srand((unsigned int)time(NULL));
vector<int> v1;
vector<int> v2;
list<int> l3;


for(int i = 0; i < 10; i++)
{
l3.push_back(rand() % 10);
}
for_each(l3.begin(), l3.end(), MyPrint01());
cout << endl;
for(int i = 0; i < 10; i++)
{
v1.push_back(rand() % 10);
}


// for(int i = 0; i < 10; i++)
// {
// v2.push_back(rand() % 10);
// }
/*
_OutIt merge(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _InIt2 _Last2,
_OutIt _Dest)
*/


vector<int> v3;
//v3的容器空间能容下v1和v2
//v3.resize(v1.size() + v2.size());
v3.resize(v1.size() + l3.size());


//默认从小到大
sort(v1.begin(), v1.end(),MyCompare01());
// sort(v2.begin(), v2.end(),MyCompare01());
l3.sort(MyCompare01());
//没排序之前当掉的原因是没有排序必须是有序的才可以调用merge函数
//默认从小到大,如果改了规则这个也要添加
// merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), MyCompare01());
//MyPrint01 Print;
//for_each(v3.begin(), v3.end(), Print);
//这样俩种写法都行,声明了对象就是放对象,或者直接放匿名对象();
// for_each(v3.begin(), v3.end(), MyPrint01());
// cout << "-------------" << endl;
merge(v1.begin(), v1.end(), l3.begin(), l3.end(), v3.begin(), MyCompare01());
for_each(v3.begin(), v3.end(), MyPrint01());
}


//random_shuffle
void test02()
{
vector<int> v;
//list<int> v;//报错的原因是list不支持随机访问
for(int i = 0; i < 9; i++)
{
v.push_back(i);
}


//STL 语法丑陋不堪 但是效率很高 一切考虑的都是效率
for_each(v.begin(), v.end(), MyPrint01());
cout << endl;
//打乱
//如果容器不支持随机访问就不能用
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint01());
cout << endl;
}


//reverse
void test03()
{
vector<int> v;
//list<int> v;//不支持随机访问
for(int i = 0; i < 9; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), MyPrint01());
cout << endl;
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint01());
cout << endl;
}


int main(int argc, char *argv[])
{
//test01();
//test02();
test03();
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值