【嵌入式八股2】C++:STL容器与算法

1. STL常见容器及其内部实现的数据结构

序号 名称 描述 存储结构 常用方法和操作

1vector动态分配的数组顺序数组(array)v.push_back()v.pop_back()v.insert()v.erase()v.capacity()v.size()v.at(idx)v.front()v.back()
2list双向链表离散lt.push_back()lt.push_front()lt.insert()lt.erase()lt.sort()lt.merge()lt.splice()
3stack用 list 或 deque 实现push()pop()top()
4queue队列用 list 或 deque 实现push()pop()front()back()
5deque双端队列分段连续(多个 vector 连续)d.push_back()d.push_front()d.pop_back()d.pop_front()d.insert()d.erase()
6priority_queue优先级队列vectorpush()pop()top()
7set集合(有序不重复)红黑树(弱平衡二叉搜索树)insert()erase()find()count()clear()
8multiset集合(有序可重复)红黑树insert()erase()find()count()clear()
9unordered_set集合(无序不重复)哈希表insert()erase()find()count()clear()
10map键值对(有序不重复)红黑树insert()erase()find()count()clear()
11multimap键值对(有序可重复)红黑树insert()erase()find()count()clear()
12unordered_map键值对(无序不重复)哈希表insert()erase()find()count()clear()
13hash_map哈希表(类似 map哈希表insert()erase()find()count()clear()

2. deque底层数据结构

deque 底层实现通常是分段连续的内存结构,即由多个 vector 组成,允许高效的从两端进行元素的插入和删除。

3. 红黑树

红黑树是一种非严格平衡的二叉查找树,具有自动排序的功能。每个节点存储一个颜色(红或黑),并且通过调整树的结构保持特定的平衡条件,从而保证最坏情况下的查找效率。

4. 常见排序算法

4.1 sort()

  • 适用容器:仅支持随机访问的容器,如 vectordequearray
  • 功能:快速排序。
bool func(int a, int b) {return a > b;  // 降序排列
}
sort(vec.begin(), vec.end(), func);  // 对vector进行排序

4.2 partial_sort()

  • 功能:对部分元素进行排序,使用堆排序实现。
  • 参数:排序范围,默认排序前 n 个元素。
int n = 4;  // 需要排序的元素个数
partial_sort(vec.begin(), vec.begin() + n, vec.end(), func);  // 排序前4个元素

4.3 is_sorted()

  • 功能:检查容器是否已排序。
  • 返回值:布尔值,true 表示已排序。
bool result = is_sorted(vec.begin(), vec.end(), func);

4.4 is_sorted_until()

  • 功能:返回第一个破坏排序规则的元素位置。
auto it = is_sorted_until(vec.begin(), vec.end(), func);

5. 查找操作

5.1 find()

  • 功能:查找指定元素。
vector<int> vec{10, 20, 30, 40, 50};
auto it = find(vec.begin(), vec.end(), 30);  // 查找30
if (it != vec.end()) {cout << "查找成功:" << *it;
} else {cout << "查找失败";
}

5.2 find_if()

  • 功能:根据自定义谓词查找元素。
bool mycomp(int i) {return (i % 2) == 1;  // 查找奇数
}
vector<int> myvector{4, 2, 3, 1, 5};
auto it = find_if(myvector.begin(), myvector.end(), mycomp);

6. 使用 vector 避免频繁的内存重新分配

vector 在扩容时通常会以 2 倍容量增长,这会导致频繁的内存分配和元素拷贝。为了优化性能,可以采取以下策略:

6.1 预分配内存

在创建 vector 时,可以使用 reserve() 方法预先分配内存,以减少多次扩容。

6.2 合理选择初始容量

根据数据的预计大小选择合适的初始容量,避免不必要的扩容操作。

6.3 优化算法

使用时间复杂度较低的算法,避免在数据量增大时造成性能瓶颈。

7. vector 的 resize() 与 reserve()

7.1 resize()

  • 功能:调整容器的大小。
  • 效果:如果 n 小于当前大小,则删除尾部元素;如果 n 大于当前大小,新的元素会被默认构造并添加到尾部。

7.2 reserve()

  • 功能:调整容器的容量,不会改变当前大小。
  • 效果:用于减少扩容次数,确保容器有足够的内存空间。

8. vector 扩容原理

  • 扩容过程:每次扩容时,vector 会分配新的内存块并将现有元素复制到新内存中,旧内存被释放。
  • 扩容系数:通常情况下,vector 容量每次会翻倍或增加 1.5 倍,这可以减少频繁的扩容。

8.1 Linux中的内存管理

在Linux系统中,内存区域以2的倍数扩容,以便进行高效的内存分配。

8.2 Windows中的内存管理

在Windows系统中,内存分配通常会增加1.5倍,以便更好地利用已经释放的内存。

9. 迭代器

迭代器是STL中用于访问容器元素的一种抽象工具。通过迭代器,容器元素的访问具有一致的接口,并且可以实现多态。

注意:迭代器只能前进,不能回退。

10. 迭代器失效的情况

迭代器可能会因为容器结构的修改而失效。不同类型的容器失效的情况略有不同:

  • 数组型数据结构(如 vector):insert 和 erase 操作会使插入或删除点之后的所有迭代器失效。
  • 链表型数据结构(如 list):erase 操作只会使指向删除元素的迭代器失效,其他迭代器不受影响。
  • 树型数据结构(如 map):erase 操作会使指向删除元素的迭代器失效,其他迭代器不受影响。 insert 操作不会使任何迭代器失效。

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

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

相关文章

vmcore分析锁问题实例(x86-64)

问题描述&#xff1a;系统出现panic&#xff0c;dmesg有如下打印&#xff1a; [122061.197311] task:irq/181-ice-enp state:D stack:0 pid:3134 ppid:2 flags:0x00004000 [122061.197315] Call Trace: [122061.197317] <TASK> [122061.197318] __schedule0…

在Apple Silicon上部署Spark-TTS:四大核心库的技术魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心库的技术魔法解析 &#x1f680; &#xff08;M2芯片实测&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心库功能全景图 &#x1f50d; 在Spark-TTS的部署过程中&#xff0c;pip install numpy li…

leetcode03 -- 武汉旅游查询系统

武汉旅游查询系统 1 界面展示 1.首页地图界面 2.查找功能 在查找框内输入查找的景点名称 查找到的景点在地图上进行定位,右侧展示景点的详细信息。 3.添加景点功能 在地图上点击某个位置,系统弹出一个输入框供用户填写景点的名称和描述。 在弹出的输入框中输入景点名…

玩机进阶教程----MTK芯片设备刷机导致的死砖修复实例解析 连电脑毫无反应 非硬件问题

在高通芯片机型中,我们可以通过短接主板测试点来激活高通芯片特有的9008底层端口来刷写救砖固件。但通常MTK芯片类的设备联机电脑即可触发深刷模式。但有些例外的情况会导致链接电脑毫无反应。遇到类似故障的友友可以参阅此博文尝试解决。 通过博文了解 1💝💝💝-----实…

09-设计模式企业场景 面试题-mk

文章目录 1.工厂(方法)模式1.1.简单工厂模式(不是设计模式,是编程习惯)1.2.工厂方法模式(企业开发中最常见)1.3.抽象工厂模式2.策略模式2.1.登录案例(工厂模式+策略模式)3.责任链设计模式4.单点登录怎么是实现的?5.权限认证是如何实现的6.上传数据的安全性你们怎么控…

BUUCTF-Web(1-20)

目录 一.SQL注入 (1)[极客大挑战 2019]EasySQL 万能密码 (7)[SUCTF 2019]EasySQL 堆叠注入 解一&#xff1a; 解二&#xff1a; (10)[强网杯 2019]随便注 堆叠注入 解一&#xff1a; 解二&#xff1a; 解三&#xff1a; (8)[极客大挑战 2019]LoveSQL 联…

软件包安装管理Gitlab

官方提供了非常详尽的系统及自动化脚本安装教程 Gitlab官网下载地址&#xff1a;https://gitlab.cn/install/ 1、安装配置 今天我们说一下包安装管理&#xff0c;这样方便我们自己更精确的制定符合我们自己需要的Gitlab仓库 配置&#xff1a;ubuntu2004(focal) 4C8G 下载程…

hadoop执行sqoop任务找不到jar

sqoop:1.4.7 hadoop:3.4.1 数据:oracel-hdfs 2025-04-15 16:57:00,850 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 2025-04-15 16:57:00,901 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 2025-04-15 …

空地机器人在复杂动态环境下,如何高效自主导航?

随着空陆两栖机器人(AGR)在应急救援和城市巡检等领域的应用范围不断扩大&#xff0c;其在复杂动态环境中实现自主导航的挑战也日益凸显。对此香港大学王俊铭基于阿木实验室P600无人机平台自主搭建了一整套空地两栖机器人&#xff0c;使用Prometheus开源框架完成算法的仿真验证与…

MCP调用示例-GitHub仓库操作

在上一篇文章MCP核心概念和应用 ———AI 大模型的标准化工具箱里&#xff0c;我们讲述了MCP的安装&#xff0c;现在让我们试一试通过示例了解它的功能吧&#xff01; 首先确保你已经有了相应的APIKEY。 &#x1f4a1;大模型中转API推荐 ✨中转使用教程 1、点击界面上的 「Done…

zk源码—5.请求的处理过程一

大纲 1.服务器的请求处理链 (1)Leader服务器的请求处理链 一.PrepRequestProcessor请求预处理器 二.ProposalRequestProcessor事务投票处理器 三.SyncRequestProcessor事务日志处理器 四.AckRequestProcessor投票反馈处理器 五.CommitProcessor事务提交处理器 六.ToBeA…

小程序获取用户总结(全)

获取方式 目前小程序获取用户一共有3中(自己接触到的),但由于这个API一直在改,所以不确定后期是否有变动,还是要多关注官方公告。 方式一 使用wx.getUserInfo 实例: wxml 文件<button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo&quo…

[LeetCode 1871] 跳跃游戏 7(Ⅶ)

题面&#xff1a; 数据范围&#xff1a; 2 ≤ s . l e n g t h ≤ 1 0 5 2 \le s.length \le 10^5 2≤s.length≤105 s [ i ] s[i] s[i] 要么是 ′ 0 ′ 0 ′0′ &#xff0c;要么是 ′ 1 ′ 1 ′1′ s [ 0 ] 0 s[0] 0 s[0]0 1 ≤ m i n J u m p ≤ m a x J u m p <…

【Linux】基础 IO(文件描述符、重定向、缓冲区)

Linux 1.理解文件2.C文件接口1.打开 写文件2.读文件 简单实现cat命令3.输出信息到显示器的方式4.stdin、stdout、stderr5.打开文件的方式 3.系统接口 IO1.传递标志位2.open、close3.write、read 4.文件描述符1.是什么&#xff1f;2.分配规则3.重定向原理4.通过dup2系统调用重…

Apache Doris SelectDB 技术能力全面解析

Apache Doris 是一款开源的 MPP 数据库&#xff0c;以其优异的分析性能著称&#xff0c;被各行各业广泛应用在实时数据分析、湖仓融合分析、日志与可观测性分析、湖仓构建等场景。Apache Doris 目前被 5000 多家中大型的企业深度应用在生产系统中&#xff0c;包含互联网、金融、…

交换机与路由器的默契配合:它们的联系与区别

交换机与路由器的默契配合&#xff1a;它们的联系与区别 一. 交换机与路由器的基本功能1.1 交换机的功能1.2 路由器的功能 二. 交换机和路由器的区别三. 交换机和路由器的联系3.1 数据转发的协作3.2 网络分段与分隔3.3 协同工作提供互联网接入 四. 交换机和路由器的联合应用场景…

【计算机系统结构】MIPSsim

目录 双击MIPSsim.exe 问题1&#xff1a;Microsoft Defender SmartScreen阻止了无法是被的应用启动&#xff0c;运行此应用可能会导致你的电脑存在风险 解决 出现下面的问题的话&#xff0c;建议直接在官网下载 问题2&#xff1a;.NET Framework 3.5安装错误代码0x80240438 …

map 中key 是否可以放置的自定义的对象?

在 Java 中,可以将自定义对象作为 Map 的 Key,但必须满足以下条件: 1. 必须正确重写 hashCode() 和 equals() 方法 原因:Map(如 HashMap)依赖这两个方法确定键的唯一性和存储位置。未正确重写的风险: 无法正确查找值:即使两个对象逻辑上相等,若 hashCode 不同,会被视…

【笔记ing】AI大模型-04逻辑回归模型

一个神经网络结构&#xff0c;其中的一个神经网络层&#xff0c;本质就是一个逻辑回归模型 深度神经网络的本质就是多层逻辑回归模型互相连接或采用一定的特殊连接的方式连接在一起构成的。其中每一个层本质就是一个逻辑回归模型。 逻辑回归模型基本原理 逻辑回归&#xff0…

Android学习总结之算法篇七(图和矩阵)

有向图的深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;的示例&#xff0c;以此来模拟遍历 GC Root 引用链这种有向图结构&#xff1a; 一、深度优先搜索&#xff08;DFS&#xff09; import java.util.*;public class GraphDFS {privat…