【C/C++】STL学习所得
文章目录
- STL 框架核心组成部分
- STL 序列容器分类
- STL 容器适配器分类
- STL 迭代器分类
- STL 中一些易混淆知识点
- 一些重要的简述
 
STL 框架核心组成部分
- 算法
- 容器
- 迭代器
- 适配器
- 空间配置器
- 访函数
STL 序列容器分类
- vector
- queue
- list
- array
- forward_list
STL 容器适配器分类
- stack 栈
- queue 队列
- priority_queue 优先级队列
STL 迭代器分类
- 输入迭代器;
- 输出迭代器;
- 正向迭代器;
- 双向迭代器;
- 随机迭代器
STL 中一些易混淆知识点
-  STL 是谁开发的? 
 STL 是由A_xx、M_xx、D_xx 三个大佬在惠普实验室开发的。
-  array 容器会支持边界检查吗? 
 不支持。可以利用容器的at方法,进行判断array容器中即将访问的元素是否存在,若不存在at方法,会返回std::out_of_range的异常。
-  deque 容器支持一次性删除多个元素吗? 
 支持。比如:
// 删除索引为1到3的元素(包括1和3)
dq.erase(dq.begin() + 1, dq.begin() + 4);
-  迭代器是指针吗? 
 迭代器不一定是指针,但它们可以类似于指针的操作。迭代器是一种抽象的概念,它提供了对容器中元素的访问和操作的方式。
 对于大多数STL容器,迭代器通常是一个类对象,而不是指针。这是因为STL迭代器需要提供更多的功能,例如支持随机访问、迭代器失效处理等。迭代器类对象通常会重载一些运算符,以实现类似指针的操作,如解引用、自增、自减等。
 然而,对于一些底层的容器,如std::array和std::vector,它们的迭代器可以是指针。这是因为这些容器在内存中是连续存储的,因此可以直接使用指针来表示迭代器。
-  vector 容器中的iterator 迭代器是随机迭代器吗? 
 是的。因为vector容器的内存是连续的,所以可以进行随机访问容器内存。
一些重要的简述
- 简述 STL 中迭代器与C++指针的异同点。
相同点:都用于访问和操作数据结构中的元素。都支持解引用操作,可以通过迭代器或指针获取元素的值。都支持自增和自减操作,可以在容器或数组中移动到下一个或上一个元素。异同点:类型:迭代器是STL中的一种抽象概念,可以是类对象,也可以是指针。而指针是C++语言中的原生类型。功能:迭代器提供了更多的功能,如随机访问、迭代器失效处理等。指针只提供了基本的指针操作。范围:迭代器可以用于不同类型的容器,如vector、list、deque等。指针主要用于数组和指针类型。安全性:迭代器提供了一些安全机制,如边界检查、失效处理等,以防止访问越界或失效的迭代器。指针没有这些安全机制,需要程序员自己负责边界检查和失效处理。迭代器分类:STL中的迭代器有多种分类,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。每种迭代器都有不同的功能和限制。指针可以被视为随机访问迭代器。总的来说,迭代器是STL中用于访问和操作容器元素的抽象概念,提供了更多的功能和安全机制。指针是C++语言中的原生类型,主要用于数组和指针类型,功能相对较简单。在使用STL时,迭代器是首选的元素访问方式,而指针则更适用于一些特定的场景。
vector:
1. 类似于动态数组,增删过程中自动调整自身大小。即vector容器可自动处理存储数据所需的空间;
2. 容器内存空间具有连续性;
3. 新增插入元素,元素位置越靠前,插入效率越低;同样的,删除元素,该元素位置越靠前,删除效率越低;
4. 用一个vector容器初始化另一个vector容器的元素,元素类型必须相同;
5. vector 迭代器存在失效风险。原因是,因为vector容器是一个顺序容器,内存是连续的,当增删元素后,为了保证容器数据连续性,容器中元素会移动,相应地数据地址也发生了变化,所以迭代器访问时就会失效出错。
deque:
1、deque容器与vector容器相似,都是动态内存管理;
2、与vector容器相比,deque容器支持两端增删元素;
3、与vector容器相比,不支持vector容器的reserve、capacity、data,新增了pop_front(), push_front(), 用于从队列首部弹出与插入元素的方法;array:
1、array容器大小固定,不允许增删容器元素;
- 简述关联容器中各个容器的特点。
 关联容器,都是以二叉树作为内部数据结构,可实现高效查找元素,但是不可以进行任意位置的操作。
set与multiset:
1、二者都是集合(区别在于对于重复元素的允许。前者允许,后者拒绝);
2、二者要求存储的数据类型一致;
3、二者都支持增删查,对于修改,不可以直接进行修改(因为二叉树中元素变动,必须自动排序),若需要修改元素,必须要先查找到原元素,删除原先元素,再进行新增新元素,新元素会被放置到一个自动排序的位子。
map与multimap:
1、二者都是映射,类似于字典;
2、前者映射,不允许存在重复的键值元素对,然后,后者映射,允许重复的键值元素对。相关文章:
【C/C++】STL学习所得
文章目录 STL 框架核心组成部分STL 序列容器分类STL 容器适配器分类STL 迭代器分类STL 中一些易混淆知识点一些重要的简述 STL 框架核心组成部分 算法容器迭代器适配器空间配置器访函数 STL 序列容器分类 vectorqueuelistarrayforward_list STL 容器适配器分类 stack 栈qu…...
 
leetcode几个数组题
数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址 二分查找 移除元素 有序数组的平方 209.长度最小的子数组...
 
【LeetCode】模拟实现FILE以及认识缓冲区
模拟实现FILE以及认识缓冲区 刷新缓冲逻辑图自定义实现如何强制刷新内核缓冲区例子 刷新缓冲逻辑图 自定义实现 mystdio.h #pragma once #include <stdio.h>#define NUM 1024 #define BUFF_NOME 0x1 #define BUFF_LINE 0x2 #define BUFF_ALL 0x4typedef struct _MY_FIL…...
 
【Terraform学习】使用 Terraform 将 EC2 实例作为 Web 服务器启动(Terraform-AWS最佳实战学习)
使用 Terraform 将 EC2 实例作为 Web 服务器启动 实验步骤 前提条件 安装 Terraform: 地址 下载仓库代码模版 本实验代码位于 task_ec2 文件夹中。 变量文件 variables.tf 在上面的代码中,您将声明,aws_access_key,aws_secr…...
 
WebGL 变量uniform、gl.getUniformLocation、gl.uniform4f及其同族函数相关
目录 uniform变量命名规范 获取 uniform 变量的存储地址 gl.getUniformLocation 向uniform变量赋值 gl.uniform4f 编辑 gl.uniform4f()的同族函数 demo:点击webgl坐标系的四个象限绘制各自不同颜色的点 uniform变量命名规范 var FSHADER_SOURCE uniform vec4…...
 
【Visual Studio】生成.i文件
环境 VS版本:VS2013 问题 如何生成.i预编译文件? 步骤 1、打开VS项目属性,打开C/C\预处理器页面,【预处理到文件】选择是,开启。 2、生成文件如下。 3、正常编译需要关闭此选项。...
 
本地生活服务平台加盟哪家公司好?
本地生活的竞争从年初的火热到现在,已经进入了下半场,随着优胜劣汰的筛选,那么直到现在,想做本地生活服务平台加盟,哪家公司比较好呢,应该如何选择呢? 首先我们得弄懂,我们加盟本地…...
css-grid使用
文章目录 grid概念容器和项目网格轨道:网格单元网格线 使用分配item空间大小对于子元素的意义 行列指定隐式和显示网格默认排列 grid容器属性grid-template-rows: 100px 100px 200px;grid-template-columns: 100px 100px 100px;grid-auto-rows: 200pxgrid-column-ga…...
springBoot提取一个List<?>中的某个字段集合
import cn.hutool.core.collection.CollUtil;PageResult prrecommendUserApi.queryRecommendUserList(dto.getPage(),dto.getPagesize(),userId);List<RecommendUser> items (List<RecommendUser>) pr.getItems(); //提取所有推荐的用户id List<Long> ids …...
【BUG】 ‘cv2.cv2‘ ‘wechat_qrcode_WeChatQRCode‘
首发博客地址 https://blog.zysicyj.top/ 报错内容 AttributeError: module cv2 has no attribute wechat_qrcode_WeChatQRCode 解决方法 pip install opencv-pythonpip install opencv-contrib-python 本文由 mdnice 多平台发布...
 
10 Mybatis
文章目录 1 概述1.1 什么是Mybatis?1.2 JDBC介绍(了解)1.2.1 问题分析1.2.2 技术对比 1.3 数据库连接池1.4 lombok 2 Mybatis基础操作2.1 准备2.2 删除2.2.1 日志输入2.2.2 预编译SQL2.2.2.1 介绍2.2.2.2 SQL注入2.2.2.3 参数占位符 2.3 新增2.3.1 主键返回 2.4 更新2.5 查询2…...
【PHP】PHP的面向对象编程
PHP面向对象编程是PHP编程的一个重要方向,它通过将数据和操作封装在对象中,使得代码更加模块化、可重用性和易于维护。本文将介绍PHP面向对象编程的基本概念、核心思想和常见应用,并探讨使用PHP面向对象编程时需要注意的问题。 一、概述 PH…...
 
Windows10突然出现音频无法正常运行的解决方法
文章目录 前言 一 问题描述 二 解决方法 2.1 下载完成之后选择安装 2.2 选择其他位置来安装 2.3 静静等待安装完成 三 升级Windows显卡和声卡 总结 前言 本文主要介绍Windows里面的音频出现问题的解决方法 一 问题描述 Windows使用好好的,突然就出现声卡出…...
Maven面试题大全及答案
1.什么是Maven? Maven使用项目对象模型(POM)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可…...
探究字符串匹配算法:暴力法与KMP算法的Java实现
探究字符串匹配算法:暴力法与KMP算法的Java实现 字符串匹配是计算机科学中的基本问题之一,它涉及在一个主串中查找特定的子串。在本文中,我们将深入探讨暴力法和KMP算法这两种常见的字符串匹配算法,并提供详细的Java代码示例。 …...
前端面试:【浏览器与渲染引擎】工作原理与渲染流程
嗨,亲爱的读者!你是否曾经好奇过当你在浏览器中输入URL并按下回车时,网页是如何显示在你的屏幕上的?这背后涉及了复杂的浏览器工作原理和渲染流程。本文将带你深入了解浏览器如何工作以及网页如何被渲染出来。 1. 浏览器的工作原理…...
 
PySide6学习笔记--gui小模版使用
一、界面绘制 1.desiner画图 2.画图代码 # -*- coding: utf-8 -*-################################################################################ ## Form generated from reading UI file t1gui.ui ## ## Created by: Qt User Interface Compiler version 6.5.2 ## ##…...
如何用Python实现冒泡排序
1 问题 冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻的元素可以交换,就表…...
 
C++Qt堆叠窗体的使用案例
本博文源于笔者最近学习的Qt,内容讲解堆叠窗体QStackedWidget案例,效果是选择左侧列表框中不同的选项时,右侧显示所选的不同的窗体。 案例效果 案例书写过程 控件都是动态创建的,因此.h文件需要创建控件,.cpp书写业务…...
 
Linux之套接字UDP实现网络通信
Linux之套接字UDP实现网络通信 文章目录 Linux之套接字UDP实现网络通信1.引言2.具体实现2.1需要知道的套接字接口1.socket()2.bind()3.recvfrom()4.sendto() 2.2服务器端server.hpp2.3服务器端server.cc2.4客户端Client.cc 1.引言  套接字(Socket)是计算机网络中实现网络通信…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
 
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
 
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
 
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
 
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
 
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
