C++ STL中五个常用算法使用教程及实例讲解

目录
  • 前言
  • sort()排序
  • 常用遍历算法for_each()
  • 常用遍历算法 搬运transform()
  • 查找算法find
  • 删除操作erase()
  • 实例应用

前言

在C++中使用STL算法都要包含一个算法头文件 #include<algorithm>

这样我们才能使用这个STL算法函数

sort()排序

  • Sort函数包含在头文件为#include<algorithm>的c++标准库中,是一个专门用来排序的高效的函数,我们在解决问题时可以方便快捷的排列顺序。
  • sort()函数中有三个参数,(数组首地址;需要结束的地址;排列方式)

第三个排列方式可以不写,系统会默认为从小到大;

让我们来看一下真实的案例

1.如果我们想从大到小排序,可以不写第三个参数

eg:

#include<iostream>

#include<algorithm>//sort()函数所需头文件 

using namespace std;

int main()

{

	 int a[10]={4,5,9,3,8,2,1,4,0,3};//初始化数组 

	 for(int i=0;i<10;i++)

	 	cout<<a[i];
		cout<<endl; 

	sort(a,a+10);//没有第三个参数,系统默认从小到大排序 

	 for(int i=0;i<10;i++)

	 {
	 	cout<<a[i];
	}
	 return 0;

}

运行结果

2.当然,如果我们不想排完整个数组,只想将前几位从大到小排序也是可以的

Sortt函数的第三个参数可以用这样的语句告诉程序你所采用的排序原则

less<数据类型>()//从小到大排序

greater<数据类型>()//从大到小排序

eg:

#include<iostream>

#include<algorithm> 

using namespace std;

int main()

{

	 int a[10]={4,5,9,3,8,2,1,4,0,3};//初始化数组 

	 for(int i=0;i<10;i++)

	 	cout<<a[i];
	 	cout<<endl; 

	sort(a,a+10,greater<int>());//没有第三个参数,系统默认从小到大排序 

	 for(int i=0;i<10;i++)

	 {
	 	cout<<a[i];
	}
	 return 0;

}

常用遍历算法for_each()

for_each()是一个常用的遍历算法

它的使用除迭代器外还需要包含仿函数或者普通函数来帮助他输出遍历结果,

eg:

#include<iostream>

#include<algorithm>

#include<vector>

using namespace std;
//常用遍历算法for_each

//普通函数
void print01(int val)
{
	cout<<val<<" ";
 } 

 //仿函数
 class print02
 {
 	public:
 		void operator()(int val)
 		{
			cout<<val<<" ";
		}
  } ;
  //测试案例
void test01()
{
	vector<int>v1;
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);//尾插法
	}
	for_each(v1.begin(),v1.end(),print01);//利用普通函数遍历
	cout<<endl;

	for_each(v1.begin(),v1.end(),print02());//利用仿函数遍历
	cout<<endl;
 }
int main()
{
	test01();
}

常用遍历算法 搬运transform()

使用方式与for_each()类似,它的使用除迭代器外还需要包含仿函数或者普通函数来帮助他输出遍历结果,

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//常用遍历算法  搬运transform

 //仿函数
 class Transform
 {
 	public:
 		int operator()(int val)
 		{
			return val;
		}
  } ;

  //仿函数
 class print02
 {
 	public:
 		void operator()(int val)
 		{
			cout<<val*10<<" ";
		}
  } ;

  //测试案例
void test01()
{
	vector<int>v1;//原容器
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);//尾插法
	}
	vector<int>target;//目标容器 

	target.resize(v1.size());//提前给target目标容器开辟容量 

	transform(v1.begin(),v1.end(),target.begin(),Transform());//返回v1*10 

	for_each(target.begin(),target.end(),print02());//利用仿函数遍历
}
int main()
{
	test01();
 }

查找算法find

功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end();

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;

//查找内置数据类型
void test01()
{
	vector<int>v1;
	for(int i=0;i<10;i++)
	{
		v1.push_back(i);//尾插法
	}
	vector<int>::iterator it=find(v1.begin(),v1.end(),5);
	if(it==v1.end())
	{
		cout<<"没有找到"<<endl;
	}
	else
	cout<<"找到了"<<endl;
}

int main()
{
	test01();
 } 

删除操作erase()

删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束

a.erase(a.begin()+1,a.begin()+3);

erase()有三种用法

(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)

实例应用

讲了这么多的算法,合理的使用它们,会极大简化我们的代码量和工作量;

下面我们就用这些算法函数来解决一道题;

(1)常规解法代码量大且容易出错

#include<stdio.h>
#include<string.h>
int main()
{
	char s1[100];
	gets(s1);
	char s2[100];
	gets(s2);
	int len1,len2;//字符串长度
	len1=strlen(s1);
	len2=strlen(s2);
	int i,j,k;//循环变量
	int flag=1;//控制while循环
	int f;//判断是否删除
	while(flag)
		for(i=0; i<len1; i++)
		{
            flag=0;//默认s1中不存在符合要求的子串,若遍历完后flag仍为0则程序结束
			if(s1[i]==s2[0])//寻找与子串第一个字母相同的字符
			{
				f=1;//默认从第i个字符开始的子串符合要求
				for(j=i,k=0; k<len2; j++,k++)//检验是否符合要求
					if(s1[j]!=s2[k])//若不符合要求,则f=0,退出for循环的检验
					{
						f=0;
						break;
					}
				if(f)//若f不为0,则进行删除操作
				{
					flag=1;//即存在符合要求的子串,将flag=1以便再次检查
					for(; j<len1; j++,i++)//将后面的字符逐一替换到前面
						s1[i]=s1[j];
					for(; i<len1; i++)//对后续多余的字符串进行清空
						s1[i]='\0';
					break;//重新开始for循环,从第一位开始寻找
				}
			}
			len1=strlen(s1);//重新计算s1的长度,此步影响的用时很小,可有可无
		}
	puts(s1);
	return 0;
}

(2)STL算法解题

我们使用上面讲到的两种算法来解决这个问题

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string s1, s2;
    getline(cin, s1);            //行输入
    getline(cin, s2);

    while (s1.find(s2) < s1.length())        //判断S1中是否还存在S2
    {
        s1=s1.erase(s1.find(s2), s2.length());        //将S1中的S2删除掉
    }
    cout << s1 << endl;

    return 0;
}

使用STL解决问题高效又快捷 

以上就是C++ STL中五个常用算法使用教程及实例讲解的详细内容,更多关于C++ STL算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • c++ STL常用遍历算法

    需要引入头文件#include<algorithm> 1.for_each #include<iostream> using namespace std; #include <vector> #include <algorithm> class MyPrint { public: void operator()(int val) const{ cout << val << " "; } }; void printV

  • C++ STL中常见的算法使用方式

    目录 什么是STL? 0. < algorithm> 是什么: 1. Non-modifying sequence operations: 1.1 find:(Find value in range) 1.2 count:(Count appearances of value in range) 1.3 equal:(Test whether the elements in two ranges are equal) 1.4 search:(Search range for subsequen

  • c++非变易算法-stl算法

    C++ STL标准模板库在数据结构和算法的实践领域发挥着重要作用,极大的提高了开发效率.STL的三大组成部分为容器.迭代器.算法,本文主要讲解STL算法中的非变易算法.本文从实践的角度简单介绍了一下相关函数的使用. C++ STL的非变易算法(Non-mutating algorithms)是一组不破坏函数数据的模板函数,用来对序列数据进行逐个处理.元素查找.子序列搜索.统计和匹配,基本上可用于各种容器.下面的叙述中迭代器区间默认为[first, last),迭代器具有"++"迭代和&

  • C++ STL中五个常用算法使用教程及实例讲解

    目录 前言 sort()排序 常用遍历算法for_each() 常用遍历算法 搬运transform() 查找算法find 删除操作erase() 实例应用 前言 在C++中使用STL算法都要包含一个算法头文件 #include<algorithm> 这样我们才能使用这个STL算法函数 sort()排序 Sort函数包含在头文件为#include<algorithm>的c++标准库中,是一个专门用来排序的高效的函数,我们在解决问题时可以方便快捷的排列顺序. sort()函数中有三个

  • javascript中数组的常用算法深入分析

    前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.本文将给大家详细介绍了javascript中数组的常用算法,下面话不多说了,来一起看看详细的介绍吧 一.不改变原数组,返回新数组(字符串) 1.concat()   连接两个或者多个数组,两边的原始数组都不会变化,返回的是被连接数组的一个副本. 2.join()  把数组中所有的元素放入到一个字符串中,返回字符串 var a = [1

  • Numpy中转置transpose、T和swapaxes的实例讲解

    利用Python进行数据分析时,Numpy是最常用的库,经常用来对数组.矩阵等进行转置等,有时候用来做数据的存储. 在numpy中,转置transpose和轴对换是很基本的操作,下面分别详细讲述一下,以免自己忘记. In [1]: import numpy as np In [2]: arr=np.arange(16).reshape(2,2,4) In [3]: arr Out[3]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11

  • 对angularJs中controller控制器scope父子集作用域的实例讲解

    1.ctrl1是父级控制器,ctrl2和ctrl3都是ctrl1的子级控制器, 2.父级ctrl1中name值的改变会影响ctrl2和ctrl3中name值的改变, 3.但是ctrl2有自己的name输入传的值,不会影响ctrl1和ctrl3,这就是继承隔离, 4.ctrl3无name赋值就继承父级ctrl1中的name的值. 一.继承隔离的情况 <div ng-app="module"> <div ng-controller="ctrl1">

  • C#算法之全排列递归算法实例讲解

    排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: 复制代码 代码如下: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (

  • 在Python中实现贪婪排名算法的教程

    在较早的一遍文章中,我曾经提到过我已经写了一个属于自己的排序算法,并且认为需要通过一些代码来重新回顾一下这个排序算法. 对于我所完成的工作,我核实并且保证微处理器的安全.对非常复杂的CPU进行测试的一个方法就是创建该芯片的另一个模型,其可以用来产生在CPU上运行的伪随机指令流.这所谓的ISG(指令流产生器)能够在很短的时间内创建几千(甚至几百万)个这样的测试,通过某种方式,使其可以巧妙地给出一些对将在CPU上执行的指令流的控制或操纵. 现在对这些指令流进行模拟,可以通过每一个测试实例花费的时间获

  • iOS开发中实现一个简单的图片浏览器的实例讲解

    一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 复制代码 代码如下: // //  YYViewController.m //  03-图片浏览器初步 // //  Created by apple on 14-5-21. //  Copyright (c) 2014年 itcase. All rights rese

  • jQuery:delegate中select()不起作用的解决方法(实例讲解)

    jQuery有一个很好用的delegate(事件委派)功能,可以给当前以及将来(动态添加)的元素绑定一个事件处理函数. 比如下面的例子,动态添加一个输入文本框后,我想让所有文本框(不管是不是动态添加的)在获取焦点时,自动转大写. 复制代码 代码如下: <!doctype html><html><head>    <title>delegate测试</title> <script type="text/javascript"

  • WordPress中用于更新伪静态规则的PHP代码实例讲解

    flush_rewrite_rules() 函数用来删除然后根据现有的条件重写伪静态规则,也就是刷新一次伪静态规则了. 先来说一下,通常在主题或者插件添加新的自定义文章类型的时候调用,防止新的自定义文章类型的文章出现 404 的情况,或者很多时候我们都需要在主题启用的时候执行一些代码,比如布置一些数据库表单.跳转到设置页面等等,WordPress 本身并没有提供相关的钩子,网上也有很多五花八门的实现方法,经过我的研究,发现了可能是最优的方法,下边分享给大家: /** *WordPress 在主题

  • C++ STL中的常用遍历算法分享

    目录 1.for_each 功能描述 函数原型 2.transform 功能描述 函数原型 1.for_each 功能描述 实现容器遍历 函数原型 for_each(itertor beg,iterator end,_func);//遍历算法 遍历容器元素//beg 开始迭代器//end 结束迭代器//_func函数或者函数对象 代码 #include <iostream> using namespace std; #include <vector> #include <al

随机推荐