从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;我们将深入探索汽车充电桩主…

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

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

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

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中的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 的性…

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…

报名 | 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;…

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

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

使用ROC指标100次盈利交易后,众汇才明白的道理

使用ROC指标100次盈利交易后才明白的道理&#xff0c;众汇外汇认为盈利的基本就是考虑这些指标。 ①.资产波动性 需要考虑到资产波动性&#xff0c;根据资产的波动性更改设置&#xff0c;设置的结果会告诉投资者这段时间的平均波动率。 ②添加过滤器。交易系统的主要指标是趋…

MySQL无法打开情况下读取frm文件的表结构

一、背景&#xff1a; 开发人员通过MySQL客户端工具&#xff0c;可以访问MySQL5.7.6&#xff0c;可以访问具体的DB&#xff0c;可以查看小写表的数据&#xff0c;但是无法查看大写表的数据&#xff0c;报错信息为“table does not exist”。 二、检查与分析&#xff1a; ssh登录…

圈子交友系统话题设置-免费圈子社区论坛交友系统-圈子交友系统功能介绍-APP小程序H5多端源码交付!

1. 圈子的独特创造与精心管理 源码赋予用户创造独特圈子的能力&#xff0c;为志同道合的人们打造一个分享兴趣、交流见解的平台。每个圈子都可以个性化定制主题、标签和规则&#xff0c;以确保圈子具备个性特点和强烈的社群感。作为圈子的创建者&#xff0c;您将享有自由编辑资…

Ableton Live 12 Suite for Mac/Win:引领音乐制作新纪元的创意神器

在数字音乐制作领域&#xff0c;Ableton Live 12 Suite无疑是一颗璀璨的明星。这款强大的音乐制作工具&#xff0c;无论你是Mac用户还是Windows用户&#xff0c;都能为你带来前所未有的音乐创作体验。 Ableton Live 12 Suite的出色之处在于其全面而精细的功能设计。从音频录制…

计算机考研|25科软值得冲吗?会不会炸?

给大家看一串数字&#xff1a;3300 4300 1400 3300 3900 没错&#xff0c;这就是科软这几年的报考学生的实际情况&#xff0c;21年的时候&#xff0c;报考人数达到了峰值&#xff0c;有4300人&#xff0c;当年复试线388分真的可以说是炸穿地心。24年报考人数3900人&#xff0c…

485口还是网口?西门子PLC通讯方式到底怎么选?

西门子作为最早进入中国市场的工控厂家&#xff0c;其市场占有率一直非常高。 西门子PLC的品质非常好&#xff0c;其网络稳定性、开放性深受工控人员的喜爱&#xff0c;而且编程软件分类多&#xff0c;使用方便。在国内工控界具有显著地位。 虽然大家对西门子PLC都有一定的了…

酚类壳聚糖Dextran和F127-CHO胶束交联形成可注射水凝胶

酚类壳聚糖Dextran和F127-CHO胶束交联形成可注射水凝胶 形成水凝胶的过程 壳聚糖与酚类小分子的偶联&#xff1a;壳聚糖是一种天然的、具有多个氨基和羟基的多糖&#xff0c;这些功能基团使其能够与酚类小分子进行化学偶联。酚类小分子可以通过共价键&#xff08;如酰胺键或醚…

vue3引入图片 无法使用require, vue3+vite构建项目使用require引入包出现问题需要用newURL来动态引入图片等静态资源

在vue3中 require引入图片的本地资源报错Uncaught (in promise) ReferenceError: require is not defined <template> <img :src"imageSrc" alt"My Image"> </template> <script> import imageSrc from /assets/image.png; export…