C++ 标准模板库(STL)——算法(Algorithms)的用法及理解
C++ STL中的算法(Algorithms)作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。按照对容器内容的操作可将STL 中的算法大致分为四类:
(1)只读算法:指不直接修改其所操作的容器内容的算法。
(2)可变序列算法:指可以修改它们所操作的容器内容的算法。
(3)排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
(4)数值算法:对容器内容进行数值上的对比或计算。
本次只针对C++ STL 中常用的算法进行介绍,包括算法的使用场景、具体用法以及算法功能。
(1)只读算法
1)查找算法
find(begin, end, value)
在迭代区间[begin, end)内查找等于value的元素,找到返回对应的迭代器,否则返回end迭代器。
find_first_of(begin, end, begin2, end2)
在迭代区间[begin, end)内查找与区间[begin2, end2)内任意匹配的元素,找到返回第一个指向匹配元素的迭代器,否则返回第一个区间的end迭代器。
find_end(begin, end, begin2, end2)
与find_frist_of类型,区别:返回最后一个指向匹配元素的迭代器。
find_if(begin. end, func)
函数find的带一个函数参数的_if版本,与find功能相同,找等于value的元素。条件:使函数func返回true,否则不执行操作。
2)搜索与统计算法
search(begin, end, begin2, end2)
在迭代区间[begin, end)内查找子序列[begin2, end2),找到返回区间[begin, end)匹配子序列的迭代器,否则返回end迭代器。
search_n(begin, end, n, value)
在迭代区间[begin, end)内查找连续出现n个value的子序列,找到返回区间[begin, end)匹配n个value的迭代器,否则返回end迭代器。
count(begin, end, value)
统计在迭代区间[begin, end)内等于value的元素个数。
lower_bound(begin, end, value)
在迭代区间[begin, end)内查找第一个大于value的元素,找到返回区间[begin, end)第一个大于value的元素的迭代器,否则返回end迭代器。
upper_bound(begin, end, value)
在迭代区间[begin, end)内查找第一个小于value的元素,找到返回区间[begin, end)第一个小于value的元素的迭代器,否则返回end迭代器。
count_if(begin, end, func)
函数count的带一个函数参数的_if版本,与count功能相同,统计在迭代区间[begin, end)内等于value的元素个数。条件:使函数func返回true,否则不执行操作。
(2)可变序列算法
copy(begin, end, begin2)
将迭代区间[begin, end)元素复制到以begin2开始的迭代区间。
transform(begin, end, begin2, func)
功能与copy相同,只是每个元素需要经过函数func的处理。
replace(begin, end, value1, value2)
将迭代区间[begin, end)中等于value1的元素替换为value2.
fill(begin, end, value)
将迭代区间[begin, end)内元素都写入value。
fill_n(begin, n, value)
从位置begin开始的n个元素写入value。
generate(begin, n, rand)
向从begin开始的n个位置随机填写数据。
remove(begin, end)
移除区间[begin, end)内的元素,并不真正删除元素,只是将要删除的元素移动到容器的末尾。
unique(begin, end)
移除区间[begin, end)内的相邻重复的元素,并不真正删除元素,不会改变容器的大小,只是这些元素的顺序改变了,是将无重复的元素复制到序列的前端,从而覆盖相邻的重复元素。unique返回的迭代器指向超出无重复的元素范围末端的下一位置。
remove_if(begin, end, func)
remove的if版本,在函数func返回true的情况下执行remove。
replace_if(begin, end, func, value2)
replace的if版本,在函数func返回true的情况下执行replace。
remove_copy(begin, end, dest)
remove的_copy版本,将反转后的序列输出到从dest开始的迭代区间。
remove_copy_if(begin, end, dest, func)
remove_copy的_if版本,在函数func返回true的情况下执行remove_copy。
replace_copy(begin, end, dest, value1, value2)
replace的_copy版本,将替换后的序列输出到从dest开始的迭代区间。
replace_copy_if(begin, end, dest, func, value2)
repalce_copy的_if版本,在函数func返回true的情况下执行replace_copy。
注意copy,transform,fill_n和generat都需要保证:输出序列有足够的空间。
(3)排序算法
sort(begin, end)
将迭代区间[begin, end)内的元素按字典次序排列。
stable_sort(begin, end, func)
将迭代区间[begin, end)内的元素按字典次序排列,同时保存相等元素之间的顺序关系。
partial_sort(begin, mid, end)
对迭代区间[beg,end]内的mid - beg个元素进行排序,将最小的mid - beg个元素有序放在序列的前mid - beg的位置上。
random_shuffle(begin, end)
将迭代区间[begin, end)内的元素随机排序。
reverse(begin, end)
将迭代区间[begin, end)内的元素反转。
rotate(begin, mid, end)
将区间[begin, mid)和[mid, end)旋转,使mid成为新的起点。
merge(begin, end, begin2, end2, nbegin)
将序列[begin, end)和[begin2, end2)合并到一个新的序列nbegin中,并对其排序。
reverse_copy(begin, end, dest)
reverse的_copy版本,将reverse过后的序列输出到从dest开始的迭代区间。
rotate_copy(begin, mid, end, dest)
rotate的_copy版本,将rotate过后的序列输出到从dest开始的迭代区间。
(4)数值算法
equal(begin, end, begin2, end2)
判断两个区间元素是否相等。
includes(begin, end, begin2, end2)
判断[begin, end)序列是否被第二个序列[begin2, end2)包含。
max_element(begin, end)
返回迭代区间[begin, end)内最大元素的位置。
min_element(begin, end)
返回迭代区间[begin, end)内最小元素的位置。
mismatch(begin, end, begin2, end2)
查找两个序列中第一个不匹配的元素,返回一对迭代器标记第一个不匹配元素的位置。
C++ 标准模板库(STL)——算法(Algorithms)的用法及理解的更多相关文章
- C++标准模板库STL算法与自适应容器(栈和队列)
参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
随机推荐
- 再见Xshell、Xftp!Python执行Linux命令、上传下载远程文件
相信大家应该都接触过Linux操作系统(Ubuntu.Centos等),那么在使用的Linux操作系统需要使用一些远程ssh工具,尤其是公网服务器. 常用的ssh工具主要有:Xshell.MobaXt ...
- .Net Core gRPC 实战(一)
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现. 可用 ...
- Spring Mvc Long类型精度丢失
背景 在使用Spring Boot Mvc的项目中,使用Long类型作为id的类型,但是当前端使用Number类型接收Long类型数据时,由于前端精度问题,会导致Long类型数据转换为Number类型 ...
- ELK技术栈之-Logstash详解
ELK技术栈之-Logstash详解 前言 在第九章节中,我们已经安装好Logstash组件了,并且启动实例测试它的数据输入和输出,但是用的是最简单的控制台标准输入和标准输出,那这节我们就来深入的 ...
- 图像超分辨率算法:CVPR2020
图像超分辨率算法:CVPR2020 Unpaired Image Super-Resolution using Pseudo-Supervision 论文地址: http://openaccess.t ...
- mybatis之Param注解
一.作用 使用@Param注解表示给参数命名,名称就是括号中的内容.给参数命名,然后在映射文件中就能根据名称获取参数值了.在mybatis中我们常常要使用到多个参数,但是在xml中的parameter ...
- itools安装程序无法创建临时文件夹
做个记录: itools链接ios设备后,安装程序包时提示:无法创建临时文件夹 主要原因可能有以下几点 1.手机储存空间不足. 2.驱动组建被删除了,重启管理软件会自动跟新驱动. 解决办法:1.清除空 ...
- 深入理解JVM,7种垃圾收集器,看完我跪了
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并 ...
- HTTP头部POST表单详解
2 POST /hello/checkUser.html?opt=xxx HTTP/1.1 方法的声明,Get,Post,Delete等 3 Accept: */* 4 Referer: http:/ ...
- Task异常捕获的方式
这节来讲一下如果捕获Task的异常. 当Task运行中出现了异常,正常情况下我们在主线程的Try是捕获不到的,而如果在Task内部写try,出现了异常我们会完全不知道.下面就来介绍几个主线程捕获Tas ...