C++程序设计:原理与实践(进阶篇)16.1 标准库算法

简介:

摘要

Programming: Principles and Practice Using C++, Second Edition

算法和映射

理论上,实践是简单的。

——Trygve Reenskaug

本章将完成我们对STL基本思想的介绍以及对STL所提供工具的纵览。在本章中,我们主要关注算法。我们的主要目的是给你介绍一些最有用的算法,它们能够节省你大量时间,即使达不到以月计,也能达到以天计。每个算法都将通过其使用示例和支持的编程技术来介绍。本章的另一个目的是提供足够的工具,令你在需要标准库和其他库之外的特性时有能力自己编写优雅高效的算法。另外,本章还将介绍三种容器:map、set和unordered_map。

16.1 标准库算法


标准库大约提供了80种有用的算法。所有算法都至少在某些场景下对某些人是有用的;我们将在本章着重介绍其中一些对很多人通常都有用的算法以及一些对某些人极为有用的算法:

挑选的标准算法

r = f?ind(b,e,v) r指向[b:e)中v首次出现的位置

r = f?ind_if(b,e,p) r指向[b:e)中令p(x)为true的第一个元素x

x = count(b,e,v) x为v在[b:e)中出现的次数

x = count_if(b,e,p) x为[b:e)中满足p(x)为true的元素的个数

sort(b,e) 用<运算符对[b:e)排序

sort(b,e,p) 用谓词p对[b:e)排序

copy(b,e,b2) 将[b:e)拷贝至[b2:b2+(e-b));b2之后应有足够的空间用于存储元素

unique_copy(b,e,b2) 将[b:e)拷贝至[b2:b2+(e-b));不拷贝相邻的重复元素

merge(b,e,b2,e2,r) 将有序序列[b2:e2)和[b:e)合并,并放入[r:r+(e-b)+(e2-b2))之中

r = equal_range(b,e,v) r是有序范围[b:e)的一个子序列,且其中所有元素值均为v,本质上是通过二分搜索查找v

equal(b,e,b2) [b:e)和[b2:b2+(e-b))的所有元素对应相等?

x = accumulate(b,e,i) x是将i与[b:e]中所有元素进行累加的结果

x = accumulate(b,e,i,op) 与accumulate类似,但用op进行“求和”运算

x = inner_product(b,e,b2,i) x是[b:e)与[b2:b2+(e-b))的内积

x = inner_product(b,e,b2,i,op,op2) 与inner_product类似,但用op和op2取代内积的+和*

 

默认情况下,相等比较用==进行,而序则是基于<(小于)的。标准库算法可在<algorithm>找到。如果想获得更多信息,请参考附录C.5和16.2~16.5节中列出的资源。这些算法接受一个或几个序列。一个输入序列由一对迭代器定义,一个输出序列由一个指向首元素的迭代器定义。通常,一种算法可以由一个或多个操作参数化,这些操作可以定义为函数对象或函数。这些算法通常会通过返回输入序列尾来报告“失败”。例如,如果f?ind(b,e,v)未找到v,则返回e。


相关文章
|
9月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
机器学习/深度学习 算法 自动驾驶
1494 0
|
10月前
|
算法 API 数据安全/隐私保护
深度解析京东图片搜索API:从图像识别到商品匹配的算法实践
京东图片搜索API基于图像识别技术,支持通过上传图片或图片URL搜索相似商品,提供智能匹配、结果筛选、分页查询等功能。适用于比价、竞品分析、推荐系统等场景。支持Python等开发语言,提供详细请求示例与文档。
|
监控 算法 安全
公司电脑监控软件关键技术探析:C# 环形缓冲区算法的理论与实践
环形缓冲区(Ring Buffer)是企业信息安全管理中电脑监控系统设计的核心数据结构,适用于高并发、高速率与短时有效的多源异构数据处理场景。其通过固定大小的连续内存空间实现闭环存储,具备内存优化、操作高效、数据时效管理和并发支持等优势。文章以C#语言为例,展示了线程安全的环形缓冲区实现,并结合URL访问记录监控应用场景,分析了其在流量削峰、关键数据保护和高性能处理中的适配性。该结构在日志捕获和事件缓冲中表现出色,对提升监控系统效能具有重要价值。
362 1
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
323 17
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
350 8
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
331 5
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
705 0
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
303 0
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
480 0