C/C++知识点头文件系列(八)——algorithm
小标 2018-06-15 来源 : 阅读 939 评论 0

摘要:本文主要向大家介绍了C/C++知识点头文件系列的algorithm,通过具体的内容向大家展现,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点头文件系列的algorithm,通过具体的内容向大家展现,希望对大家学习C/C++知识点有所帮助。

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'); //结果:3int 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);//结果:10int nn = max(1,5);                   //结果:5int* m = min_element(nData,nData+10);//结果:1int 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));  //升序

C/C++知识点头文件系列(八)——algorithm

  函数输入之所以要求必须是一个升序的排列,原因在于函数运行一次对输入的数组进行移动排列一次后,在函数退出前判断移动后的数组是否升序,如果升序则函数返回布尔变量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));  //降序

C/C++知识点头文件系列(八)——algorithm

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程