C/C++笔试必须熟悉掌握的头文件系列(八)——algorithm

1. 说明

  “algorithm”头文件是实用性巨大的标准模板库(STL,Standard Template Library)的算法部分,里边定义了STL各种算法。像大家熟悉的各种容器(container),诸如vector、list等;以及迭代子(iterator)都属于标准模板库的成员。
  另外需要注意STL和标准程序库的区别,STL是属于C++标准程序库(C++ Standard Library)一部分。标准程序库泛指C++官方定义和方便我们使用而设计的库文件。STL包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundation Class Library),或者是Borland C++ Builder中的VCL(Visual Component Library)。
  其它内容请读者另查资料,自行阅读,这里不再过多介绍。反正“algorithm”头文件是一个高效而方便的工具包,里面包含的基本数据结构和基本算法能够大大提高我们编程效率。诸如排序,字典全排序,查找字符,反转字符串等等算法不需要我们自行定义和编程,直接调用该头文件很方便。

2. 笔试必掌握内容

  “algorithm”包含的函数有很多,这里不再一一列举,下面只挑几个很重要的函数算法详细介绍一下。
 2.1 count()
  统计给定值或字符的个数,例如字符串中统计某个字符的个数。需要注意的是,参数使迭代子,可以把它理解为指针类型。函数使用如下:

char nzBuf[50] = "Hello world! Wu Xie Tong Xie";
string str     = "abcddddd";
int nLen       = count(nzBuf, nzBuf+strlen(nzBuf),'l'); //结果:3
int nLen_new   = count(str.begin(),str.end(),'d');//结果:5

 2.2 find()
  返回第一个值等价于给定值的元素,记住返回的是指针或游标迭代子,而不是索引。输入参数需要注意的同上。

char nzBuf[50] = "Hello world! Wu Xie Tong Xie";
string str     = "abcddddd";
char* nzRet  = find(nzBuf,nzBuf+49, 'o'); //结果nzRet为"o world! Wu Xie Tong Xie",指向'o'起头的字符串;
string::iterator a = find(str.begin(),str.end(), 'c');//结果:"cddddd"
int aa =str.find('c'); //string类自带函数方法,可以返回索引位置

 2.3 search()
  在范围A中查找第一个与范围B等价的子范围的位置。例如查找子字符串功能。

char nzBuf[50] = "Hello world! Wu Xie Tong Xie";
char nzBuf1[50] = "Wu";
char* nRel = search(nzBuf,nzBuf+49,nzBuf1,nzBuf1+1) ;//结果:"Wu Xie Tong Xie"

 2.4 swap()
  交换两个对象的值,用处很广,无论交换两个整型,还是两个字符数组,非常实用。如:

char nzBuf[50] = "Hello world! Wu Xie Tong Xie";
char nzBuf1[50] = "Wu";
swap(nzBuf,nzBuf1);  //字符数组存储发生交换

 2.5 reverse()
  反转排序指定范围中的元素。这个函数应用也很广泛,如下:

char nzBuf[50] = "Hello world! Wu Xie Tong Xie";
reverse(nzBuf,nzBuf+strlen(nzBuf)); //字符数组从后往前排序了

 2.6 sort()
  排序功能,无需多说,用处很广。但是单独默认参数下的排序是升序,而添加一个返回bool类型的函数如下cmp才可以实现降序,函数名或形参名可以任意更换,主要记住函数完成的功能室返回前一个参数大于后一个参数的判断值。而小于则是升序的排列

bool cmp(int a,int b)
{
    return a>b;
}

int nData[10] = {1,3,4,2,5,8,1,2,10,2};
sort(nData,nData+10);    //升序排列
sort(nData,nData+10,cmp);//降序排列

 2.7 max/max_element/min/min_element
   max是返回两个元素中值最大的元素,max_element是返回给定范围中值最大的元素。min是返回两个元素中值最小的元素,而min_element是返回给定范围中值最小的元素。注意两者之间的区别,一个是两个数比较,而另一个是多个值之间比较。

int nData[10] = {1,3,4,2,5,8,1,2,10,2};
int* n = max_element(nData,nData+10);//结果:10
int nn = max(1,5);                   //结果:5
int* m = min_element(nData,nData+10);//结果:1
int mm = min(nData[0],nData[2]);     //结果:1(看清楚,只比较数组中第1个和第三个数,即4和1中寻找最小的数)

 2.8 unique()
  删除指定范围中的所有连续重复元素,仅仅留下每组等值元素中的第一个元素。注意两点,第一点,该函数仅是处理元素连续重复的情况,而不是整个指定范围中重复的元素。所以如果想移除整个整个范围重复元素,先进行排序然后再调用该函数。
  第二点,unique并不是真正的把重复的元素删除,其实是,该函数把重复的元素移到后面去了,然后依然保存到了原数组中。、
  函数返回去重后最后一个元素的地址。

string str           = "abcdddddbccccd";
string::iterator rel = unique(str.begin(),str.end());  //rel=“dbccccd”,str =“abcdbcdbccccd”

  VS上实验是以上结果,反正去除元素很准确,总感觉返回的后半段有点错误,不知道原因。有了解的望告诉。
 2.9 next_permutation()/prev_permutation
  两者的功能返回分别为,给定范围中的元素组成的下一个按字典序的排列,以及返回给定范围中的元素组成的上一个按字典序的排列。
  由上面的性质,我们可以根据数据字典排序做升序或者降序的全排列。
  如下:

    int arr[N] = {1,2,3,4}; //一定注意该处是最小排列情况,下面会详解原因
    do
    {
        for(int i=0; i < N; i++)
            printf("%d ",arr[i]);
        putchar('\n');
    }  while(next_permutation(arr,arr+N));  //升序


这里写图片描述

  函数输入之所以要求必须是一个升序的排列,原因在于函数运行一次对输入的数组进行移动排列一次后,在函数退出前判断移动后的数组是否升序,如果升序则函数返回布尔变量false,否则返回true。这样当你输入的是一个升序的排列后,每运行一次函数就对数组进行一次移动得到一个新的排列,函数对数组的移动排列采用递归方式。当所有排列方式都遍历一遍后函数最后一次输出的又是一个升序的排列,也就是和你最先输入的数组一样的排列。
  所以要做到函数实现字典的全排列,先要将数据进行排序,初始状态一定要是数据内部是升序的情况,才能依次迭代而打印出所有的全排列的结果。
  同样的道理,降序排序则先让数据初始状态属于降序的给过:

int arr[N] = {4,3,2,1};
do
{
    for(int i=0; i < N; i++)
        printf("%d ",arr[i]);
    putchar('\n');
} while(prev_permutation(arr,arr+N));  //降序


这里写图片描述


个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值