从C向C++14——STL初识及函数对象

一.STL初识

1.STL的诞生

  • 长久以来,软件界一直希望建立一种可重复利用的东西
  • C++的面向对象泛型编程思想,目的就是复用性的提升
  • 多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
  • 为了建立数据结构和算法的一套标准,诞生了STL

2.STL的基本概念

  • STL(Standard Template Library,标准模板库)
  • STL从广义分为: 容器(container) 算法(algorithm) 迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝连接
  • STL 几平所有的代码都采用了模板类或者模板函数

3.STL六大组件

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

  • 1.容器: 各种数据结构,如vector、list、deque、set、map等,用来存放数据.
  • 2.算法: 各种常用的算法,如sort、find、copy、for_each
  • 3.迭代器: 扮演了容器与算法之间的胶合剂
  • 4.仿函数: 行为类似函数,可作为算法的某种策略。
  • 5.适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  • 6.空间配置器: 负责空间的配置与管理。

4. 容器、算法、迭代器

容器:置物之所也。
STL容器就是将运用最广泛的一些数据结构实现出来,常用的数据结构:数组,链表,树,栈队列,集合,映射表等。

这些容器分为序列式容器和关联式容器两种:

  • 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置,上面例子常见容器都是序列式容器
  • 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

算法:问题之解法也。

有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)]

算法分为:质变算法和非质变算法。

  • 质变算法: 是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等;
  • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。

迭代器:容器和算法之间粘合剂。

提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式

每个容器都有自己专属的选代器

迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针

迭代器种类:
在这里插入图片描述

常用的容器中迭代器种类为双向迭代器,和随机访问选代器

二.函数对象

1.函数对象理解

  • 重载函数操作调用符()的类,其对象常称为函数对象
  • 函数对象使用重载的()时,行为类似函数调用,也叫仿函数

函数对象(仿函数)本质是一个类,而不是一个函数。

函数对象使用:

  • 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值

    class Myadd
    {
    public:int operator()(int v1, int v2){return v1 + v2;}
    };void test01()
    {Myadd myadd;cout << myadd(10, 10) << endl;
    }
    
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态

    class Myadd
    {
    public:Myadd() {this->count = 0;}int operator()(int v1, int v2){return v1 + v2;}int count;
    };
    
  • 函数对象可以作为参数传递

三.谓词

1.一元谓词

  • 返回bool类型的仿函数称为谓词
  • 如果operator()接受一个参数,那么叫做一元谓词
  • 如果operator()接受两个参数,那么叫做二元谓词
class greatfive
{
public:bool operator()(int val){return val>5;}
};

2.二元谓词

class Myadd
{
public:bool operator()(int v1, int v2){return v1>v2;}};

四.内建函数对象

1.内建函数概念

STL自己建立一些仿函数,叫它内建函数

这些仿函数分类有:

  • 算数仿函数
  • 关系仿函数
  • 逻辑仿函数

这些仿函数所产生的对象,用法和一般函数完全相同

使用内建函数对象,需要引入头文件#include <functional>

2.算术仿函数

功能:

  • 实现四则运算
  • 其中negate取反是一元运算,其他都是二元运算

仿函数原型:

template<class T> T plus<T>                    //加法仿函数
template<class T> T minus<T>                   //减法仿函数
template<class T> T multiplies<T>              //乘法仿函数
template<class T> T divides<T>                 //除法仿函数
template<class T> T modulus<T>                 //取模仿函数
template<class T> T negate<T>                  //取反仿函数

使用一元仿函数:

negate<int> n;
cout<<n(50)<<endl;

使用二元仿函数

plus<int> n;
cout<<n(50,50)<<endl;

3.关系仿函数

实现关系对比:

template<class T> bool equal_to<T>                                //等于
template<class T> bool not_equal_to<T>                            //不等于
template<class T> bool greater<T>                                 //大于
template<class T> bool greater_equal<T>                           //大于等于
template<class T> bool less<T>                                    //小于
template<class T> bool less_equal<T>                              //小于等于

4.逻辑仿函数

template<class T> bool logical_and<T>                           //逻辑与
template<class T> bool logical_or<T>                            //逻辑或
template<class T> bool logical_not<T>                           //逻辑非

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解汽车充电桩主板的硬件设计与软件系统

随着电动汽车时代的到来&#xff0c;充电桩逐渐成为城市新地标。而在每一个充电桩的核心&#xff0c;隐藏着一颗强大的“心脏”——充电桩主板。 充电桩主板是充电桩的核心部件&#xff0c;决定着充电桩的充电效率、安全和用户体验。今天&#xff0c;我们将深入探索汽车充电桩主…

数学分析复习:三角函数的周期性

文章目录 三角函数的周期性 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 三角函数的周期性 本节的主题是研究三角函数的周期性&#xff0c;我们之前已经解析地定义三角函数为 cos ⁡ x ∑ k 0 ∞ ( − 1 ) k x 2 k ( 2 k ) ! , sin ⁡ x ∑ k 0 ∞ ( − 1 )…

Java并发编程之锁的艺术:面试与实战指南(二)

1. Java中线程和进程的区别是什么&#xff1f; 进程是系统分配资源的基本单位&#xff0c;它包含了一个或多个线程以及相关的系统资源&#xff08;如内存、文件句柄等&#xff09;。进程间相互独立&#xff0c;通过进程间通信&#xff08;IPC&#xff09;进行信息交换。线程是…

分布式版本控制工具 Git 的使用方式

文章目录 Git简介下载安装基本使用起始配置Git 的三个区域基本操作流程查看仓库状态删除&#xff08;撤销暂存区&#xff09;差异对比查看版本日志版本回退修改提交日志分支概念&#xff1a;创建分支与切换分支合并分支&#xff08;快速合并&#xff09;合并分支&#xff08;提…

jQuery中的api操作

1、认识jQuery jQuery函数 , jQuery的别 "$" , $也是一个函数. // $(function(){})// $ 是什么? $ 是一个函数// console.log(typeof $);// function// $ 是jQuery的别名?// window.jQuery window.$ jQuery;// console.log(jQuery $);// true 2、文档遍历和操…

北京筑龙当选中招协第二届招标采购数字化专业委员会执行主任单位

4月18-19日&#xff0c;中国招标投标协会&#xff08;以下简称中招协&#xff09;2024年年会在宁波召开&#xff0c;北京筑龙作为中招协理事会员单位受邀出席会议。会议期间举行了“电子招标采购专业委员会换届会议暨第二届第一次工作会议”&#xff0c;北京筑龙当选第二届招标…

用代码给孩子造“钱”

起因 作为家里有两个娃的奶爸&#xff0c;时长为了孩子乱花钱而焦虑不已。然后最近看到一段短视频说了这么段话。 父母不要被动给孩子买东西&#xff0c;而是定期给孩子钱。让孩子自己管钱培养她对于钱的认知和理财的观念。 突然感觉大师我悟了。感觉值得一试。于是就打算给他…

如何在官网查看Qt5的所有模块?

2024年4月23日&#xff0c;周二上午 如果你不想一步步来的话&#xff0c;可以直接去这个Qt官方链接 https://doc.qt.io/qt-5/qtmodules.html 第一步&#xff1a;去到Qt官网 https://www.qt.io/ 第二步&#xff1a;点击文档链接 第三步&#xff1a;选择文档中的“Qt5” 第四步…

Python项目开发实战:如何自动化读取Excel数据文件并用可视化分析

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python项目开发实战_自动化读取Excel数据文件并用可视化分析_编程案例实例课程教程.pdf 1、可视化分析的特点 在Python项目开发实战中,可视化分析扮…

Python中的tkinter工具包帮助文档查询以及Python其他GUI工具包分类

Python中的tkinter工具包帮助文档查询以及Python其他GUI工具包分类 虽然Python支持许多GUI工具包&#xff0c;然而Tkinter是Python的实际标准GUI&#xff08;图形用户界面&#xff09;包&#xff0c;也是最常用的一种。本文简要介绍tkinter工具包帮助文档查询以及Python其他GU…

SpanBert学习

SpanBERT: Improving Pre-training by Representing and Predicting Spans 核心点 提出了更好的 Span Mask 方案&#xff0c;也再次展示了随机遮盖连续一段字要比随机遮盖掉分散字好&#xff1b;通过加入 Span Boundary Objective (SBO) 训练目标&#xff0c;增强了 BERT 的性…

flask_apscheduler 定时任务框架

简介 Flask_apscheduler是一个在Flask框架中使用的APScheduler库的扩展。APScheduler是一个用于调度任务的Python库&#xff0c;可以在指定的时间间隔调度函数、方法或任意可调用对象的执行。 Flask_apscheduler对APScheduler进行了集成&#xff0c;使得在Flask应用中可以简便…

FFmpeg 源码分析:av_seek_frame()

[TOC](FFmpeg 源码分析&#xff1a;av_seek_frame()) FFmpeg 源码分析&#xff1a;av_seek_frame() 函数原型 av_seek_frame() 是 FFmpeg 中的一个函数&#xff0c;位于 libavformat/avformat.h&#xff0c;用于定位媒体文件中的某一帧。 下面是 av_seek_frame() 的函数定义…

Python小功能实现(链接下载图品并存储到EXCEL中)

import os import requests from openpyxl import Workbook from openpyxl.drawing.image import Image from concurrent.futures import ThreadPoolExecutor# 图片链接列表 image_urls ["https://uploads/file/20230205/f85Lpcv8PXrLAdmNUDE1Hh6xqkp0NHi2gSXeqyOb.png&q…

ctfshow——XSS

文章目录 XSS介绍什么是xss&#xff1f;XSS危害XSS的分类常用XSSpayload web316——反射型XSSweb317——过滤<script> web318——过滤script、imgweb319——不止过滤script、imgweb320——过滤空格web321——不止过滤空格web322——不止过滤空格web323web324web 325web32…

【笔记】短信服务设计记录

模块拆分&#xff1a; - 服务配置 - 模板 - 计费 - 日志 - 验证码管理 - 发送任务的管理 思考点 怎么与用户&#xff08;手机&#xff09;绑定&#xff0c;如何防止频繁调用。 策略模式来适配多种不同短信发送通道的场景。 短信任务管理&#xff0c;轮询和异步对生产者消…

报名 | Qt汽车及工业行业解决方案及实战训练 深圳站(5月15日 星期三)

加入我们的Qt技术培训&#xff0c;探索跨平台应用开发的无限可能&#xff01;本次培训将深入Qt框架&#xff0c;涵盖从基础概念到高级功能的全方位知识&#xff0c;无论您是刚入门的新手还是希望提升技能的资深开发者&#xff0c;都能在此找到适合自己的学习路径。通过实践案例…

OpenTelemetry-2.Go接入Jaeger(grpc,gin-http)

目录 1.什么是OpenTelemetry 2.搭建jaeger 3.链路追踪 本地调用 远程调用 GRPC proto server端 client端 Gin-HTTP 调用流程 api1 api2 grpc 4.完整代码 1.什么是OpenTelemetry 参考&#xff1a;OpenTelemetry-1.介绍-CSDN博客 2.搭建jaeger 参考&#xff1a;…

Node.js 环境变量动态获取和静态获取的区别

Node.js 环境变量动态获取和静态获取的区别 Node.js 环境 vs 浏览器环境 process.env.SERVICE_PORTAL: 适用环境&#xff1a;Node.js 环境。用途&#xff1a;访问操作系统的环境变量。 import.meta.env.SERVICE_PORTAL: 适用环境&#xff1a;浏览器环境&#xff0c;特别是在使…

齐护K210系列教程(八)_LCD显示图片

LCD显示图片 文章目录 LCD显示图片1&#xff0c;显示单张图片2&#xff0c;通过按键切换显示SD卡内的图片3&#xff0c;通过传感器切换图片4&#xff0c;画中画显示&#xff0c;并缩放5&#xff0c;课程资源 联系我们 AIstart 显示的图片的默认分辨率为&#xff1a;320*240 &am…