C++STL之整理算法

时间:2022-04-26
本文章向大家介绍C++STL之整理算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这里主要介绍颠倒、旋转、随机排列和分类4中常见的整理算法

1、颠倒(反转)

void reverse(_BidIt _First, _BidIt _Last)

_OutIt reverse_copy(_BidIt _First, _BidIt _Last,_OutIt _Dest)

2、旋转

_FwdIt rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last)

_OutIt rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last,_OutIt _Dest)

交换[_First, _Mid)和[_Mid, _Last)的位置

3、随机排列

void random_shuffle(_RanIt _First, _RanIt _Last, _Fn1& _Func)

4、分类(注意分类算法需要写一个分类标准的结构体,需要继承STL的函数对象uniry_function或binary_function)

_BidIt partition(_BidIt _First, _BidIt _Last, _Pr _Pred)

_BidIt stable_partition(_BidIt _First, _BidIt _Last, _Pr _Pred)

将迭代器区间内的数据分成两部分,符合标准的数据将放在的迭代器区间的前面部分,不符合标准的放在迭代器的后半部分

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<functional>
 4 using namespace std;
 5 void print(int *num,int n)
 6 {
 7     for(int i=0;i<n;i++)
 8     {
 9         cout<<num[i]<<' ';
10     }
11     cout<<endl;
12 }
13 int main()
14 {
15     int num[10]={1,2,4,5,7,3,4};
16     print(num,7);
17     //void reverse(_BidIt _First, _BidIt _Last)
18     reverse(num,num+7);
19     print(num,7);
20     int num_r_copy[7];
21     //_OutIt reverse_copy(_BidIt _First, _BidIt _Last,_OutIt _Dest)
22     reverse_copy(num,num+7,num_r_copy);
23     print(num,7);
24     print(num_r_copy,7);
25 
26 
27     //_FwdIt rotate(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last)
28     //交换[_First, _Mid)和[_Mid, _Last)的位置
29     print(num,7);
30     rotate(num,num+1,num+7);
31     print(num,7);
32 
33     rotate(num,num+2,num+5);
34     print(num,7);
35     //rotate_copy
36     //_OutIt rotate_copy(_FwdIt _First, _FwdIt _Mid, _FwdIt _Last,_OutIt _Dest)
37     //不改变原数组,将旋转好的数组放在新的数组里
38 
39     //随机排列
40     //void random_shuffle(_RanIt _First, _RanIt _Last, _Fn1& _Func)
41     random_shuffle(num,num+7);
42     print(num,7);
43 
44     //分类
45     //注意分类算法是需要写一个分类标准的函数的,所以需要用到写一个新的结构体或者类来继承STL函数,并且重载()运算符
46     //partition、stable_partition
47     //_BidIt partition(_BidIt _First, _BidIt _Last, _Pr _Pred)
48     //将迭代器区间内的数据分成两部分,符合标准的数据将放在的迭代器区间的前面部分,不符合标准的放在迭代器的后半部分
49     struct iseven :public unary_function<int,bool>
50     {
51         bool operator()(int val)//重载()运算符
52         {
53             return val%2==0;//判断是否为偶数
54         }
55     };
56     int ynum1[10]={1,2,3,4,5,6,7,8,9,10};
57     print(ynum1,10);
58     partition(ynum1,ynum1+10,iseven());
59     print(ynum1,10);
60 
61     int ynum2[10]={1,2,3,4,5,6,7,8,9,10};
62     print(ynum2,10);
63     stable_partition(ynum2,ynum2+10,iseven());
64     print(ynum2,10);
65     return 0;
66 }