STL 之 算法

STL相关算法 算法部分主要由头文件,和组成。是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、反转、排序、合并等等。体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。中则定义了一些模板类,用以声明函数对象。STL提供了大量实现算法的模版函数,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能,从而大大地提升效率。算法主要是由头文件组成。 阅读详情

算法函数

    STL包含了很多处理容器的非成员函数。对于算法函数,它们都是用模板来提供通用类型,并且它们都是用迭代器来提供访问容器中数据的通用表示。

 

算法组

    STL将算法库分成4组:
(1) 非修改式序列操作;
(2) 修改式序列操作;
(3) 排序和相关操作;
(4) 通用数字运算。

 

    前3组在algorithm(以前为algo.h)头文件中定义。
    第4组是专用于数值数据的,在numeric(以前为algol.h)头文件中定义。

 

    非修改式序列操作对区间中的每个元素进行操作。这些操作不修改容器的内容。

 

    修改式序列操作也对区间中的每个元素进行操作。它们可以修改容器的内容。可以修改值,也可以修改值的排序顺序。

 

    排序和相关操作包括多个排序函数(包括sort())和其他各种函数,包括集合操作。

 

    数字操作包括将区间的内容累积、计算两个容器的内部乘积、计算小计、计算相邻对象差的函数。通常,这些都是数组的操作特性,因此vector是最有可能使用这些操作的容器。

 

算法的通用特征

    STL函数使用迭代器和迭代器区间。从函数原型可知有关迭代器的假设。

 

    例如,copy()函数的原型:

    template<class InputIterator, class OutputIterator>
    OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);

    InputIterator和OutputIterator都是模板参数。不过,STL文档使用模板参数名称来表示参数模型的概念。

 

    由上述声明可知,区间参数必须是输入迭代器或更高级别的迭代器,而指示结果存储位置的迭代器必须是输出迭代器或更高级别的迭代器。

 

    对算法进行分类的方式之一是按结果放置的位置进行分类。
    就地算法(in-place algorithm),例如,在sort()函数完成时,结果被存放在原始数据的位置上。

    复制算法(copying algorithm),例如,copy()函数将结果发送到另一个位置。

 

    有些算法有两个版本:就地版本和复制版本,例如,transform()函数。


    STL约定,复制版本的名称以 _copy 结尾。

 

    复制版本将接受一个额外的输出迭代器参数,该参数指定结果的放置位置。

    例如,函数replace()的原型如下:

    template<class ForwardIterator, class T>
    void replace(ForwardIterator first, ForwardIterator last, const T & old_value, const T & new_value);

    它将所有的old_value替换为new_value,这就是就地发生的。由于这种算法同时读写容器元素,因此迭代器类型必须是ForwardIterator或更高级别的。

 

    复制版本的原型如下:

    template<class InputIterator, class OutputIterator, class T>
    OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result,
                                          const T & old_value, const T & new_value);

    此时,结果被复制到result指定的新位置,因此对于指定区间而言,只读输入迭代器足够了。

 

    replace_copy()的返回值类型为OutputIterator。对于复制算法,统一的约定是: 返回一个迭代器,该迭代器指向复制的最后一个值后面的一个位置。

 

    另一个常见的变体: 有些函数有这样的版本,即根据将函数应用于容器元素得到的结果来执行操作。这些版本的名称通常以 _if 结尾。

 

    例如,如果将函数用于旧值时,返回的值为true,则replace_if()将把旧值替换为新的值。原型如下:

    template<class ForwardIterator, class Predicate, class T>
    void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T & new_value);

 

    Predicate(断言)也是模板参数名称。STL选用Predicate来提醒用户,实参应是Predicate概念的一个模型。

    同样,STL使用诸如Generator(自适应生成器)和BinaryPredicate(自适应二元断言)等术语来提示必须是其他函数对象概念模型的参数。

 

STL和string类

    string类虽然不是STL的组成部分,但它设计时考虑到了STL。例如,它包含begin()、end()、rbegin()和rend()等成员,因此可以使用STL接口。

 

函数和容器方法

    使用STL方法还是使用STL函数。通常方法是更好的选择。它更适合于特定的容器;其次,作为成员函数,它可以使用模板类的内存管理工具,从而在需要时调整容器的长度。

 

    例如,假设有一个由数字组成的链表,并要删除链表中某个特定值(例如4)的所有实例。如果la是一个list<int>对象,则可以使用链表的remove()方法:
    la.remove(4);   // remove all 4s from the list

    调用该方法后,链表中所有值为4的元素都被删除,同时链表的长度将被自动调整。

 

    如果用一个同名的remove()的STL算法,它不是由对象调用,而是接受区间参数:
    remove(la.begin(), la.end(), 4);

    效果一样,但它不能调整链表的长度。它将没被删除的元素放到链表的开始位置,并返回一个指向新的超尾值的迭代器。

 

    可以用该迭代器来修改容器的长度。

    例如,用链表的erase()方法来删除一个区间,该区间描述了链表中不再需要的部分:
    list<int>::iterator last;
    last = remove(la.begin(), la.end(), 4);
    la.erase(last,la.end());

 

    尽管方法通常更适合,但非方法函数更通用。因为可以将它们用于数组、string对象、STL容器,还可以用它们来处理混合的容器类型,例如,将矢量容器中的数据存储到链表或集合中。

STL源码剖析——STL算法之find查找算法 本文介绍的STL算法中的find、search查找算法。在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if、adjacent_find、search、search_n、lower_bound、 upper_bound、 equal_range、binary_search、find_first_of、find_end相关算法,下面对这些算法的源码进行了详细的剖析,并且适当给出应用例子,增加我们对其理解,方便我们使用这些算法。 阅读详情

相关推荐

STL源码剖析——STL算法之remove删除算法

本文介绍的STL算法中的remove删除算法,源码中介绍了函数remove、remove_copy、remove_if、remove_copy_if、unique、unique_copy。并对这些函数的源码进行详细的剖析,并适当给出使用例子。

关注校招求职,微信号:job_campus 2036

【STL算法】常用算法原型整理

STL中常用算法的算法原型整理如下 //查找重复元素 _NODISCARD _FwdIt adjacent_find(const _FwdIt _First, _FwdIt _Last, _Pr _Pred); _NODISCARD _FwdIt adjacent_find(const _FwdIt _First, const _FwdIt _Last); //二分查找(有序数列) _NODISCARD bool binary_search(_FwdIt _First, _FwdIt _Last, co

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 770

STL源码剖析——STL算法stl_algo.h

本文剖析的STL算法的源码,在剖析源码的同时会给出一些例子,这样加深对其理解,方便我们对这些算法的使用。

关注校招求职,微信号:job_campus 4002

STL常用算法的使用及举例

std::adjacent_find

qq_42896106的博客 339

STL算法库函数示例

自己的学习笔记 STL 算法库大部分函数的用法 带注释

泰克示波器TDS210改装便携示波器

泰克示波器TDS210改装编写示波器

超级网吧的博客 3079

C++_STL—较为常用的算法

C++_STL—较为常用的算法 一、非变异算法 是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。非变异算法具有极为广泛的适用性,基本上可应用与各种容器。 1.查找容器元素找到 它用于查找等于某值的元素。它在迭代器区间[first,last)(闭开区间)上查找等于value值的元素,如果迭代器i所指的元素满足*i=value,则返回迭代器...

老陈聊架构 770

王爽《汇编语言》课程设计2(不涉及软盘版本)

assume cs:code,ds:data,ss:stack stack segment db 128 dup (0) stack ends data segment db 256 dup (0) data ends code segment start: mov ax,stack mov ss,ax mov sp,128 ...

weixin_41944412的博客 1178

常用STL算法示例

目录 常用STL算法 算法简介 非变序算法 变序算法 算法示例 计数算法 搜索算法:Search() 搜索算法:Search_n() 搜索算法:Find_first_of()函数 搜索算法:Adjacent_find() 比较算法:Equal() 比较算法:equal_range() 比较算法:mismatch() 比较算法:Lexicographical_compare() 初始化算法:fill() 初始化算法:fill_n() 初始化算法:generate()&

超级霸霸强的博客 1346

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码

本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。

weixin_30632089的博客 505

Mac新手必看:nvm安装全攻略(含常见错误解决方案)

本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。

weixin_28839699的博客 1607

【STL算法】STL中的常用查找算法

文章目录findfind_ifcountcount_if find 功能: 查找指定元素,找到就返回元素的迭代器,找不到就返回结束迭代器end() 函数原型: iterator find (iterator first, iterator last, const T& val); first:开始迭代器 last:结束迭代器 val:要查找的值 vector<int> v; v.push_back(1); v.push_back(5); v.push_back(3); v.push_

qq_42434079的博客 268

戴维南和诺顿定理到底怎么选?一个实际维修案例讲透两种等效电路用法

本文通过工业电源模块维修案例,详细解析戴维南和诺顿定理在实际电路分析中的选择策略。针对电压敏感型故障、电流分配问题及功率传输异常,提供三大黄金法则,帮助工程师高效选择等效电路方法,提升故障排查效率。特别强调诺顿定理在电流分析中的优势。

weixin_31854867的博客 357

stl算法_STL算法简介

stl算法 This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples. You will learn about how these algorithm...

cunchi8090的博客 566

【亲测】ubuntu20.4 安装CUDA11.8

一步一步搭建C++ CUDA CUDNN TENSORRT OPENCV DNN ONNXRUNTIME推理环境

weixin_40950590的博客 3894

LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排

大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保

weixin_34335458的博客 407

STL算法大全

"STL算法大全"

热爱编程的小K的博客 2911

Unity音游开发全指南:模板与免费资源高效构建节奏游戏

**粒子特效** | [Universal VFX](https://assetstore.unity.com/packages/vfx/particles/universal-vfx-159182) | 免费视觉特效 || **UI素材** | [Game UI Pack](https://assetstore.unity.com/packages/2d/gui/game-ui-pack-86908) | 现代风格UI元素 |**音游开发的黄金法则**:完美的节奏游戏是音乐与游戏的和谐统一。

Loving_enjoy的博客 727

STL算法之sort

STL所提供的各式各样算法中,sort()是最复杂最庞大的一个。这个算法接受两个RandomAccessIterators(随机存取迭代器),然后将区间内的所有元素以渐增方式由小到大重新排列。还有一个版本则是允许用户指定一个仿函数代替operator

chnming1987的博客 1627

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STL常见算法总结

一、各种常见算法的用法 accumlate : iterator 对标志的序列中的元素之和,加到一个由 init 指定的初始值上。重载的版本不再做加法,而是传进来的二元操作符被应用到元素上。adjacent_different :创建一个新序列,该序列的每个新值都代表了当前元素与上一个元素的差。重载版本用指定的二元操作计算相邻元素的差。adjacent_find :在 iterator 对标志的元素范围内,查找一对相邻的重复元素,如果找到返回一个 ForwardIterator ,指向这对元素的第一

sinat_31608641的博客 4819

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

STL之算法总结

STL之算法总结 STL算法部分主要由头文件,,组成。 要使用 STL中的算法函数必须包含头文件, 对于数值算法须包含,中则定义了一些模板类,用来声明函数对象。     STL中算法大致分为四类:         1、非可变序列算法:指不直接修改其所操作的容器内容的算法。         2、可变序列算法:指可以修改它们所操作的容器内容的算法。         3、排序算

戎码人生 2950

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【C++】STL 算法概念和分类 ( STL 算法头文件 | STL 算法思想 - 数据与算法分离 | STL 算法 迭代器 | STL 算法 操作对象 | STL 算法分类 )

一、STL 算法概念 1、STL 算法头文件 2、STL 算法思想 - 数据与算法分离 3、STL 算法 迭代器 4、STL 算法 操作对象 二、STL 算法分类

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1755

STL之算法

1. 算法概述 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等… <numeric>体积很小,只包括在几个序列容器上进行的简单运算的模板函数. <functional> 定义了一些模板类,用以声明函数对象。 2. 常用遍历算法 常用遍历算法有两个,一个是for_e

kuanyew的博客 1127

STL算法的简介

一、STL算法介绍 STL算法部分主要是由三个头文件承担: algorithm、numeric、functional algorithm:意思是算法,只要想使用STL库中的算法函数就得包含该头文件。 numeric:包含了一系列用于计算数值序列的算法,其具有一定的灵活性,也能够适用于部分非数值序列的计算 functional:定义了一些模板,可以用来声明函数对象。 二、STL算法分类 质变与非质变算法: 质变算法:会改变操作对象的值。所有的STL算法都作用在[first,last)所标示的区间上

sinat_31608641的博客 2402

STL源码剖析:STL算法

诸如拷贝(copy)、互换(swap)、替换(replace)、填写(fill)、删除(remove)、排列组合(permutation)、分割(partition)、随机重排(random shuffling)、排序(sort)等算法,都属此类。查找(find),匹配(search),计数(count),巡访(for_each),比较,寻找极值(max, min)等算法。lg()计算的是二进制对数的值(即log2),并乘以 2,这是控制分割深度的手段,以防止快速排序出现性能退化的情况。

_ 1515

15-STL算法

STL算法 STL提供了很多处理容器的函数模板,它们的设计是相同的,有以下特点: 1)用迭代器表示需要处理数据的区间。 2)返回迭代器放置处理数据的结果(如果有结果)。 3)接受一个函数对象参数(结构体模板),用于处理数据(如果需要) 迭代器 向前偏移 我们在遍历标准库容器的时候习惯用iterator(迭代器)去访问容器里面的元素,常用的习惯用法是: std::vector<int> vec; vec.push_back(100); vec.push_back(101); vec

成长需要沉淀。 897
上一篇: STL 之 函数对象(函数符)
下一篇: C++其他库类介绍
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值