7.9 C++ STL算法
参考:http://www.weixueyuan.net/view/6406.html
总结:
STL提供了大量操作容器的算法,这些算法大致可以分为:排序、搜索、集合运算、数值处理和拷贝等,这些算法的实现是采用函数模板来实现的,函数模板类似于类模板。
对于STL算法而言,算法是一样的,只是所处理的容器不同,只要使用合适的迭代器,就可以直接用算法操作容器了。
如果我们需要使用STL算法,则需要在头文件中包含algorithm头文件,在本程序中使用了四种STL算法:generate、replace_if、sort和for_each。
sort函数前面两个参数仍然是迭代器,第三个参数是可选的,默认情况下sort将会以升序进行排序。
STL中还提供了很多其它的算法,在今后的学习过程中,大家如果有需要可以去查找C++的类库手册。
---------------------
STL提供了大量操作容器的算法,这些算法大致可以分为:排序、搜索、集合运算、数值处理和拷贝等,这些算法的实现是采用函数模板来实现的,函数模板类似于类模板。对于STL算法而言,算法是一样的,只是所处理的容器不同,只要使用合适的迭代器,就可以直接用算法操作容器了。
例1:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; bool compare( const int & a, const int & b)
{
return a > b;
} void display( int i )
{
cout<< i << " ";
} bool odd( int i )
{
return i % != ;
} int main()
{
vector < int > num ( );
//生成随机数字,填充num
generate( num.begin(), num.end(), rand );
//将其中的奇数全部替换我0
replace_if( num.begin(), num.end(), odd, );
//从大到小排序
sort( num.begin(), num.end(), compare );
for_each( num.begin(), num.end(), display );
cout << endl;
return ;
}
如果我们需要使用STL算法,则需要在头文件中包含algorithm头文件,在本程序中使用了四种STL算法:generate、replace_if、sort和for_each。下面我们来一一了解这四种算法的功能。
generate函数前面两个参数均为迭代器,分别指向开头和结尾,通过这两个迭代器,我们可以为num的10个元素赋值。由于num是整型的vector实例,因此要求generate函数的第三个参数返回值也为整型,因此我们将库函数rand作为第三个参数,用于生成随机数,其返回值是整型。
调用完generate函数之后,num中就分别填充了一些随机数值。replace_if前面两个参数还是两个迭代器,通过这两个迭代器我们可以对num进行遍历,遍历过程中会逐一判断元素是否为奇数,如果为奇数,则将其换为0。Replace_if要求第三个参数为一个返回bool类型的函数,为此我们专门设计了一个odd函数,用于判断数值是否为奇数,如果为奇数则返回true,否则返回false。因为num为int型vector实例,因此要求用来替换的元素也必须为int型,故replace_if函数最后一个参数必须为int型,在本例中我们直接使用0。
接着我们对num进行排序,sort函数前面两个参数仍然是迭代器,第三个参数是可选的,默认情况下sort将会以升序进行排序。本例中使用了第三个参数,第三个参数为compare函数的函数名。因为num为整型实例,因此compare函数的两个参数为整型的引用。同时由于sort函数要求第三个参数为返回一个bool类型的函数,因此compare也必须返回bool类型。本例中我们希望num以降序的方式排列,因此我们compare函数返回“a > b”。当我们返回“a < b”或者根本就不提供第三个参数时,函数将会以升序的形式排列num。
最后为了打印num中的所有元素,我们使用了for_each函数,当然如果使用循环根据下标或使用迭代器都是可以打印num中的元素的,只不过我们是想介绍一下for_each函数而已。for_each函数前面两个参数仍然是两个迭代器,通过这两个迭代器,我们就可以遍历num中的元素。for_each函数第三个参数用来完成打印操作,我们定义了一个display函数用于完成此操作。
在整个程序中我们一直没有使用任何循环就完成了整个操作,这是因为这四个函数中分别定义了内建的迭代操作,而我们只需要指明迭代的起始和终止位置即可。
STL中还提供了很多其它的算法,在今后的学习过程中,大家如果有需要可以去查找C++的类库手册。
7.9 C++ STL算法的更多相关文章
- STL算法
STL算法部分主要由头文 件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorit ...
- 【STL源码学习】STL算法学习之四
排序算法是STL算法中相当常用的一个类别,包括部分排序和全部排序算法,依据效率和应用场景进行选择. 明细: sort 函数原型: template <class RandomAccessIter ...
- 【STL源码学习】STL算法学习之三
第一章:前言 数量不多,用到的时候会很爽. 第二章:明细 STL算法中的又一个分类:分割:将已有元素按照既定规则分割成两部分. is_partitioned 函数原型: template <c ...
- 【STL源码学习】STL算法学习之二
第一章:前言 学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起. 第二章:明细 copy 函数原型: template <class InputIterator, cla ...
- 【转】三十分钟学会STL算法
转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...
- random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客
random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客 random_shuffle (stl算法)打乱顺序 2012-03-31 10:39:11| 分类: 算法 | ...
- STL源代码分析——STL算法remove删除算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...
- STL源代码分析——STL算法merge合并算法
前言 因为在前文的<STL算法剖析>中.源代码剖析许多.不方便学习.也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的merge合并算法. ...
- STL源代码分析——STL算法sort排序算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...
- 变易算法 - STL算法
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...
随机推荐
- (转)C#中base关键字的几种用法
base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法.例如: 2.1关于base调用基类构造函数 public c ...
- ubuntu无法关机,卡死
(1)第一种方法(可行,但开关机出现命令行代码) $ sudo vim /etc/default/grub 将GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ...
- 雷林鹏分享:jQuery EasyUI 表单 - 过滤下拉数据网格
jQuery EasyUI 表单 - 过滤下拉数据网格 下拉数据网格(Combogrid)组件和下拉框(Combobox)组件的共同点是,除了都具有下拉面板以外,它们都是基于数据网格(Datagrid ...
- 20165327 2017-2018-2 《Java程序设计》第2周学习总结
20165327 2017-2018-2 <Java程序设计>第2周学习总结 内容:教材第2.3章 内容小结: (一)标识符由字母.下划线.美元符号和数字组成, 并且第一个字符不能是数字字 ...
- Python操作Influxdb数据库
1.influxdb基本操作[root@test ~]# wget https://dl.influxdata.com/influxdb/releases/influxdb-1.2.4.x86_64. ...
- Confluence 6 删除和归档空间
我们希望你已经成功的完成了这个任务,同时还学习到了一些有关 Confluence 空间的多样性和强大的功能.后推到 18 个月以后,我们来看看你的火星移民计划进行的怎么样了. 如果你希望删除老的空间( ...
- stark 组件 url 二级分发的实现
模拟 admin 组件url设计思路 项目urls 文件中: from django.contrib import admin from django.urls import path from st ...
- JSX语法
什么是JSX语法:就是符合 xml 规范的 JS 语法:(语法格式相对来说,要比HTML严谨很多) 1. 如何启用 jsx 语法? 安装 `babel` 插件 - 运行`cnpm i babel-co ...
- Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined)G. Sum the Fibonacci
题意:给一个数组s,求\(f(s_a | s_b) * f(s_c) * f(s_d \oplus s_e)\),f是斐波那契数列,而且要满足\(s_a\&s_b==0\),\((s_a | ...
- springboot(十九)使用actuator监控应用
微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题? ...