捷 C++ 课程学习笔记:STL 应用与复杂度分析

news2025/2/25 21:32:15
一、STL 六大组件

STL(Standard Template Library)是 C++ 标准库的重要组成部分,提供了通用的模板类和函数,用于实现常用的数据结构和算法。STL 主要包括以下六大组件:

  1. 容器(Containers)

    • 用于存储数据的结构,如 vectorlistmap 等。
    • 容器可以分为序列容器(如 vectorlist)和关联容器(如 mapset)。
  2. 分配器(Allocators)

    • 用于管理内存分配和释放,如 allocator
    • 分配器可以与容器配合使用,提供灵活的内存管理。
  3. 算法(Algorithms)

    • 提供各种操作,如排序、搜索、遍历等,如 sortfindcount 等。
    • 算法通常与迭代器和容器配合使用。
  4. 迭代器(Iterators)

    • 用于遍历容器中的元素,如 begin()end()
    • 迭代器可以分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。
  5. 适配器(Adapters)

    • 用于扩展容器和迭代器的功能,如 vectorpush_backpop_back
    • 适配器可以将一种容器或迭代器转换为另一种形式。
  6. 仿函式(Functors)

    • 用于实现函数对象,如 lessgreater 等。
    • 仿函式可以与算法配合使用,提供灵活的操作。
二、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)not1bind2nd 用于调整函数对象的行为。
  • 仿函式(Functors)less<int> 用于比较两个整数的大小。
三、复杂度分析

在使用 STL 时,了解算法和操作的复杂度是非常重要的。常见的复杂度表示法(Big-oh)包括:

  1. O(1) 或 O©:常数时间(constant time)。

    • 示例:访问数组中的元素。
  2. O(n):线性时间(linear time)。

    • 示例:遍历一个数组或链表。
  3. O(log₂n):次线性时间(sub-linear time)。

    • 示例:二分查找。
  4. O(n²):平方时间(quadratic time)。

    • 示例:冒泡排序。
  5. O(n³):立方时间(cubic time)。

    • 示例:三重循环。
  6. O(2ⁿ):指数时间(exponential time)。

    • 示例:递归计算斐波那契数列。
  7. 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 的高级特性,并将其应用到实际项目中,以提升自己的编程能力。

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

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

相关文章

数据结构☞泛型

一.基础定义与应用方向 1.定义&#xff1a; 一般的类和方法&#xff0c;只能使用具体的类型 : 要么是基本类型&#xff0c;要么是自定义的类。如果要编写可以 应用于多种类型 的代码&#xff0c;这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介…

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的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助&#xff0c;请点链接&#xff1a; https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端&#xff08;下位机&#xff09;…

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…

C#中级教程(2)——走进 C# 面向对象编程:从基础到进阶的深度探索

一、为什么选择面向对象编程 在软件开发的演进过程中&#xff0c;随着程序规模和复杂度的不断增加&#xff0c;传统的编程方式逐渐暴露出局限性。面向对象编程应运而生&#xff0c;它就像是一位智慧的组织者&#xff0c;将程序中的功能进行模块化划分。每个模块各司其职&#x…

基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“流浪动物救助系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…

Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式

Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序&#xff1a; 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…

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+讲解+开题报告)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Teigha(ODA<Open Design Alliance>_开放设计联盟)——cad c# 二次开发

需将dll库文件与exe文件放同一路径下&#xff0c;运行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…

idea 部署 AJ-Report 启动的注意事项

AJ-Report 入门参考&#xff1a; AJ-Report 初学(入门教程) gitee 下载&#xff1a;https://gitee.com/anji-plus/report/releases 根据上面提供的 gitee 下载链接&#xff0c;点击直接下载 最上面的就是最新版本的&#xff0c;旧版本往下拉就可以找到&#xff0c;有三个下载…

智能化客户行为轨迹分析:AI视频监控在大型商场的技术方案

项目背景&#xff1a;为了提升顾客体验并支持精准营销&#xff0c;卖场或商场需要通过智能化手段分析客户在商场内的行为路线。 一、具体需求 1、行为路径分析&#xff1a;跟踪顾客在商场内的移动轨迹&#xff0c;了解顾客的购物习惯和偏好。 2、高频活动区域识别&#xff1a…

Denoising Diffusion Restoration Models论文解读

论文要点 恢复的线性逆问题可以使用预训练的DDPM完成&#xff1a;1. 将降质矩阵使用SVD&#xff0c;得到分解矩阵&#xff1b;2. 使用分解矩阵将图像投影到降质类型间共享的谱空间&#xff1b;3. 谱空间中执行DDPM。 评价 同Track的方法同样很多&#xff0c;比如后续的DDNM、…

基于SpringBoot的校园消费点评管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【NLP 38、激活函数 ④ GELU激活函数】

别盲目&#xff0c;别着急&#xff0c;慢慢走&#xff0c;没事的 —— 25.2.24 一、定义与数学表达式 GELU&#xff08;Gaussian Error Linear Unit&#xff0c;高斯误差线性单元&#xff09;是一种结合概率分布的非线性激活函数&#xff0c;其核心思想是通过输入值服从标准正…

QT:paintEvent、QPainter、QPaintDevice

paintEvent 介绍 在 Qt 编程中&#xff0c;paintEvent 是 QWidget 类中的一个非常重要的虚函数&#xff0c;用于处理绘图事件。当一个 QWidget 或其派生类的实例需要进行重绘操作时&#xff0c;Qt 会自动调用该控件的 paintEvent 函数。 触发时机 窗口首次显示&#xff1a;当…

OpenHarmony-4.基于dayu800 GPIO 实践(2)

基于dayu800 GPIO 进行开发 1.DAYU800开发板硬件接口 LicheePi 4A 板载 2x10pin 插针&#xff0c;其中有 16 个原生 IO&#xff0c;包括 6 个普通 IO&#xff0c;3 对串口&#xff0c;一个 SPI。TH1520 SOC 具有4个GPIO bank&#xff0c;每个bank最大有32个IO&#xff1a;  …

HTML项目一键打包工具:HTML2EXE 最新版

HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件&#xff0c;直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 下载地址&#xff1a; 最新版HTML2EXE首次发布下载地址 一、功能特点…

BGP配置华为——路径优选验证

实验拓扑 实验要求 实现通过修改AS-Path属性来影响路径选择实现通过修改Local_Preference属性来影响路径选择实现通过修改MED属性来影响路径选择实现通过修改preferred-value属性来影响路径选择 实验配置与效果 1.改名与IP配置 2.as300配置OSPF R3已经学到R2和R4的路由 3.…