STL中常用的算法的使用(四):变序型算法

变序型算法是通过元素值的赋值和互换,改变元素顺序,但不改变元素值。

//对于每个测试函数, 导入以下头文件
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

reverse():将指定区间元素逆转

int main()
{
	vector<int> a{ 1,2,3,4,5,6,7,8,9};
	reverse(begin(a), a.end());
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
	cout << endl;

	reverse(begin(a), a.begin()+4);
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; }); 
}

在这里插入图片描述

reverse_copy():将指定区间元素逆转,转移到目标容器

int main()
{
	vector<int> a{ 1,2,3,4,5,6,7,8,9},b;
	reverse_copy(begin(a), a.end(),back_inserter(b));
	for_each(b.begin(), b.end(), [](int i) {cout << i << ' '; });
	cout << endl;
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

rotate():旋转元素次序

int main()
{
	vector<int> a{ 1,2,3,4,5,6,7,8,9},b = a;
	rotate(a.begin(),a.begin()+3,a.end());  //可以理解中间为原地修改的起始位。
	rotate(b.begin(), b.end() -3, b.end());
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
	cout << endl; 
	for_each(b.begin(), b.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

rotate_copy():旋转元素次序,存放于指定容器

int main()
{
	vector<int> a{ 1,2,3,4,5,6,7,8,9},b;
	rotate_copy(a.begin(),a.begin()+3,a.end(), back_inserter(b));
	for_each(b.begin(), b.end(), [](int i) {cout << i << ' '; });
	cout << endl;
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

shuffle():打乱元素次序 (洗牌算法) 每次生成的不同

以时间作为随机数种子

#include <random> // std::default_random_engine
#include <chrono> // std::chrono::system_clock

int main()
{

	vector<int> a{ 1,2,3,4,5,6,7,8,9};
	// obtain a time-based seed:
	unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
	shuffle(a.begin(), a.end(), std::default_random_engine(seed)); //需要一个随机数生成函数
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

内置生成器

#include <random>
int main()
{
	vector<int> a{ 1,2,3,4,5,6,7,8,9};
	std::random_device rd;
	shuffle(a.begin(), a.end(), rd);
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

random_shuffle():打乱元素次序

不设置种子,每次随机生成的相同

int main()
{
	vector<int> a{ 1,2,3,4,5,6,7,8,9};
	random_shuffle(a.begin(), a.end());
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

以时间为种子,就不同了

#include<time.h>
int main()
{
	vector<int> a{ 1,2,3,4,5,6,7,8,9};
	srand((unsigned)time(NULL));
	random_shuffle(a.begin(), a.end());
	for_each(a.begin(), a.end(), [](int i) {cout << i << ' '; });
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值