捷 C++ 课程学习笔记:STL 应用与复杂度分析
一、STL 六大组件
STL(Standard Template Library)是 C++ 标准库的重要组成部分,提供了通用的模板类和函数,用于实现常用的数据结构和算法。STL 主要包括以下六大组件:
-
容器(Containers):
- 用于存储数据的结构,如
vector、list、map等。 - 容器可以分为序列容器(如
vector、list)和关联容器(如map、set)。
- 用于存储数据的结构,如
-
分配器(Allocators):
- 用于管理内存分配和释放,如
allocator。 - 分配器可以与容器配合使用,提供灵活的内存管理。
- 用于管理内存分配和释放,如
-
算法(Algorithms):
- 提供各种操作,如排序、搜索、遍历等,如
sort、find、count等。 - 算法通常与迭代器和容器配合使用。
- 提供各种操作,如排序、搜索、遍历等,如
-
迭代器(Iterators):
- 用于遍历容器中的元素,如
begin()和end()。 - 迭代器可以分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。
- 用于遍历容器中的元素,如
-
适配器(Adapters):
- 用于扩展容器和迭代器的功能,如
vector的push_back和pop_back。 - 适配器可以将一种容器或迭代器转换为另一种形式。
- 用于扩展容器和迭代器的功能,如
-
仿函式(Functors):
- 用于实现函数对象,如
less、greater等。 - 仿函式可以与算法配合使用,提供灵活的操作。
- 用于实现函数对象,如
二、STL 六大组件关系
STL 的六大组件之间相互配合,形成了一个强大的工具集。以下是一个具体的例子,展示了这些组件的使用:
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>using namespace std;int main() {int ia[] = {27, 210, 12, 47, 109, 83};vector<int, allocator<int>> vi(ia, ia + 6);cout << count_if(vi.begin(), vi.end(), not1(bind2nd(less<int>(), 40))) << endl;return 0;
}
- 容器(Containers):
vector<int, allocator<int>> vi用于存储整数数组ia。 - 分配器(Allocators):
allocator<int>用于管理内存分配。 - 算法(Algorithms):
count_if用于统计满足条件的元素数量。 - 迭代器(Iterators):
vi.begin()和vi.end()用于遍历容器中的元素。 - 适配器(Adapters):
not1和bind2nd用于调整函数对象的行为。 - 仿函式(Functors):
less<int>用于比较两个整数的大小。
三、复杂度分析
在使用 STL 时,了解算法和操作的复杂度是非常重要的。常见的复杂度表示法(Big-oh)包括:
-
O(1) 或 O©:常数时间(constant time)。
- 示例:访问数组中的元素。
-
O(n):线性时间(linear time)。
- 示例:遍历一个数组或链表。
-
O(log₂n):次线性时间(sub-linear time)。
- 示例:二分查找。
-
O(n²):平方时间(quadratic time)。
- 示例:冒泡排序。
-
O(n³):立方时间(cubic time)。
- 示例:三重循环。
-
O(2ⁿ):指数时间(exponential time)。
- 示例:递归计算斐波那契数列。
-
O(n log₂n):介于线性及二次方增长的中间行为模式。
- 示例:快速排序、归并排序。
四、迭代器的使用
迭代器是 STL 中的重要组件,用于遍历容器中的元素。迭代器的使用需要注意“前闭后开”区间,即 [begin, end)。
Container<T> c;
...
Container<T>::iterator ite = c.begin();
for (; ite != c.end(); ++ite) {...
}
begin():返回容器的第一个元素的迭代器。end():返回容器的最后一个元素的下一个位置的迭代器。
五、范围 for 循环
C++11 引入了范围 for 循环(range-based for loop),简化了遍历容器的代码。
for (int i : {2, 3, 5, 7, 9, 13, 17, 19}) {std::cout << i << std::endl;
}std::vector<double> vec;
...
for (auto elem : vec) {std::cout << elem << std::endl;
}for (auto& elem : vec) {elem *= 3;
}
auto:自动推导类型,简化代码编写。auto&:引用类型,用于修改容器中的元素。
六、auto 关键字
C++11 引入了 auto 关键字,用于自动推导类型,简化代码编写。
list<string> c;
...
list<string>::iterator ite;
ite = ::find(c.begin(), c.end(), target);list<string> c;
...
auto ite = ::find(c.begin(), c.end(), target);
auto:自动推导find函数返回的迭代器类型,简化代码编写。
总结
通过学习,我对 STL 的六大组件及其关系有了更深入的理解。老师帮助我掌握 STL 的核心概念和应用技巧。特别是对复杂度分析、迭代器的使用和范围 for 循环的介绍,为后续的面向对象编程和高级开发打下了坚实的基础。
在实际编程中,合理使用 STL 可以显著提高代码的可读性和可维护性。同时,理解算法的复杂度,有助于选择合适的算法和数据结构,提高程序的性能。
在未来的学习和工作中,我将继续深入探索 STL 的高级特性,并将其应用到实际项目中,以提升自己的编程能力。
相关文章:
捷 C++ 课程学习笔记:STL 应用与复杂度分析
一、STL 六大组件 STL(Standard Template Library)是 C 标准库的重要组成部分,提供了通用的模板类和函数,用于实现常用的数据结构和算法。STL 主要包括以下六大组件: 容器(Containers)…...
【python】提取word\pdf格式内容到txt文件
一、使用pdfminer提取 import os import re from pdfminer.high_level import extract_text import docx2txt import jiebadef read_pdf(file_path):"""读取 PDF 文件内容:param file_path: PDF 文件路径:return: 文件内容文本"""try:text ext…...
数据结构☞泛型
一.基础定义与应用方向 1.定义: 一般的类和方法,只能使用具体的类型 : 要么是基本类型,要么是自定义的类。如果要编写可以 应用于多种类型 的代码,这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介…...
MFC学习笔记-1
一、编辑框和按钮 //.h文件private:CString str;//给窗口类加了一个变量(定义一个成员变量),关联到IDC_EDIT1中(要在实现中关联,源文件文件夹中)CString str2;//接收button2,和IDC_EDIT2绑定 p…...
html中rel、href、src、url的区别
1.url url(统一资源定位符):是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。 2.href href:Hypertext Reference的缩写。 意思是超文本引用。 3.rel rel:relatio…...
hot100-二叉树
二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…...
嵌入式项目:STM32刷卡指纹智能门禁系统
本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助,请点链接: https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端(下位机)…...
短剧小程序系统源码
短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具,它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃! 为什么说这款源码很厉害? 首先,在当今竞争激烈的市场环境…...
鸿蒙5.0实战案例:基于measure实现的文本测量
往期推文全新看点(文中附带全新鸿蒙5.0全栈学习笔录) ✏️ 鸿蒙(HarmonyOS)北向开发知识点记录~ ✏️ 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…...
C#中级教程(2)——走进 C# 面向对象编程:从基础到进阶的深度探索
一、为什么选择面向对象编程 在软件开发的演进过程中,随着程序规模和复杂度的不断增加,传统的编程方式逐渐暴露出局限性。面向对象编程应运而生,它就像是一位智慧的组织者,将程序中的功能进行模块化划分。每个模块各司其职&#x…...
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…...
基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案
随着物联网和嵌入式技术的快速发展,嵌入式设备对实时音视频通信的需求日益增长。然而,传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题,难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点,本文将介…...
Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式
Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序: 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…...
应用层的协议-http/https的状态码
1xx:表示临时响应,需要操作者继续操作 2xx:成功,操作被成功接受并处理 3xx:一般是重定向问题 4xx:客户端的问题 5xx:服务端的问题 1xx: 100: 表示服务器收到客户端的第一部分请…...
前端Sass面试题及参考答案
目录 什么是 Sass? Sass 和 CSS 的主要区别是什么? Sass 中如何处理列表? Sass 中如何处理映射(map)? Sass 中如何使用函数? Sass 中如何使用内置函数? Sass 中如何设置默认值? Sass 中的 @function 和 @mixin 有什么区别? Sass 中如何实现模块化? Sass 中…...
python采集京东商品详情API接口系列,json数据示例返回
在Python中采集京东商品详情API接口的数据,你需要与京东开放平台(现已更名为京东联盟开放平台)进行交互。京东开放平台提供了多种API接口,用于访问京东的商品数据、用户数据等。然而,需要注意的是,京东对于…...
RT-Thread+STM32L475VET6——USB鼠标模拟
文章目录 前言一、板载资源二、具体步骤1.配置icm20608传感器2.打开CubeMX进行USB配置3. 配置USB3.1 打开USB驱动3.2 声明USB3.3 剪切stm32xxxx_hal_msp.c中的void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)函数至board.c3.…...
计算机毕业设计SpringBoot+Vue.js母婴商城(源码+LW文档+PPT+讲解+开题报告)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Teigha(ODA<Open Design Alliance>_开放设计联盟)——cad c# 二次开发
需将dll库文件与exe文件放同一路径下,运行exe即可执行。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Thread…...
Java 中 HTTP 协议版本使用情况剖析
Java 中 HTTP 协议版本使用情况剖析 一、HTTP/1.1 与 HTTP/2 概述 (一)HTTP/1.1 HTTP/1.1 是广泛应用且成熟的 HTTP 协议版本,它在互联网发展历程中扮演了重要角色。其特点主要包括: 连接方式:默认采用短连接,即每次请求都要建立新的 TCP 连接,请求完成后断开。不过也…...
Zama fhEVM应用:摩根大通旗下 Kinexys 发布概念验证
1. 引言 Zama 全同态加密 (FHE) 技术在摩根大通的 Kinexys(以前称为 Onyx)中成功进行了概念验证。该概念验证是“EPIC 项目:通过链上企业隐私、身份和可组合性推动代币化金融”的一部分,在 Kinexys 数字资产沙盒(以前…...
idea 部署 AJ-Report 启动的注意事项
AJ-Report 入门参考: AJ-Report 初学(入门教程) gitee 下载:https://gitee.com/anji-plus/report/releases 根据上面提供的 gitee 下载链接,点击直接下载 最上面的就是最新版本的,旧版本往下拉就可以找到,有三个下载…...
智能化客户行为轨迹分析:AI视频监控在大型商场的技术方案
项目背景:为了提升顾客体验并支持精准营销,卖场或商场需要通过智能化手段分析客户在商场内的行为路线。 一、具体需求 1、行为路径分析:跟踪顾客在商场内的移动轨迹,了解顾客的购物习惯和偏好。 2、高频活动区域识别:…...
解决升级flutter 3.29.0 Gradle8.7后报错 Exception has occurred. MissingPluginException
Flutter 升级后 MissingPluginException 及 Proguard 混淆问题解决方案 问题描述 在将 Flutter 从 3.24.5 升级到 3.29,以及 Gradle 升级到 8.7.0 之后,原生自己写的Flutter 插件在运行时出现以下错误: Exception has occurred. MissingPl…...
安全见闻4
今天学了Windows操作系统和驱动程序的相关知识 Windows注册表 注册表是windows系统中具有层次结构的核心数据库 储存的数据对windows 和Windows上运行的应用程序和服务至关重要。注册表时帮助windows控制硬件、软件、用户环境和windows界面的一套数据文件。 打开注册表编辑器…...
Denoising Diffusion Restoration Models论文解读
论文要点 恢复的线性逆问题可以使用预训练的DDPM完成:1. 将降质矩阵使用SVD,得到分解矩阵;2. 使用分解矩阵将图像投影到降质类型间共享的谱空间;3. 谱空间中执行DDPM。 评价 同Track的方法同样很多,比如后续的DDNM、…...
基于SpringBoot的校园消费点评管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
vue 修改el-tree高亮样式
vue 修改el-tree高亮样式 ::v-deep .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content, ::v-deep .el-tree-node > .el-tree-node__content:hover {background-color: #eff8ee !important;color: #009764; }...
【NLP 38、激活函数 ④ GELU激活函数】
别盲目,别着急,慢慢走,没事的 —— 25.2.24 一、定义与数学表达式 GELU(Gaussian Error Linear Unit,高斯误差线性单元)是一种结合概率分布的非线性激活函数,其核心思想是通过输入值服从标准正…...
QT:paintEvent、QPainter、QPaintDevice
paintEvent 介绍 在 Qt 编程中,paintEvent 是 QWidget 类中的一个非常重要的虚函数,用于处理绘图事件。当一个 QWidget 或其派生类的实例需要进行重绘操作时,Qt 会自动调用该控件的 paintEvent 函数。 触发时机 窗口首次显示:当…...
