面试题总结(四) -- STL与算法篇
面试题总结(四) – STL与算法篇
文章目录
- 面试题总结(四) -- STL与算法篇
- <1> 请列举 C++ STL 中常用的容器(如 vector、list、map 等)及其特点。
- <2> 如何在 C++ 中使用 STL 算法(如排序、查找等)?
- <3> 解释 STL 迭代器的概念和作用。
- <4> C++ 中 map 和 unordered_map 的区别是什么?
- <5> 谈谈 STL 中容器适配器(stack、queue、priority_queue)的使用。
- <6> 如何自定义 C++ STL 容器的比较函数?
- <7> 描述 C++ 中算法的复杂度分析(时间复杂度和空间复杂度)。
- <8> 举例说明在 C++ 中如何使用 STL 进行数据的批量处理。
- <9> 解释 C++ 中函数对象(functor)在 STL 中的应用。
- <10> 如何解决 C++ 中 STL 容器的迭代器失效问题?
<1> 请列举 C++ STL 中常用的容器(如 vector、list、map 等)及其特点。
vector (向量):
- 特点: 动态数组,内存连续存储,支持随机访问,在尾部添加和删除元素效率高,在中间插入和删除元素效率低。
- 理由: 连续存储使得随机访问速度快,但中间插入删除需要移动大量元素。
list (链表):
- 特点: 双向链表,非连续存储,在任意位置插入和删除元素效率高,不支持随机访问。
- 理由: 链表结构决定了插入删除操作只需修改指针,无需移动元素,但随机访问需要遍历。
map (映射):
- 特点: 基于红黑树实现的键值对数据结构,按键有序存储,查找、插入和删除的平均时间复杂度为 O(log n)。
- 理由: 红黑树的特性保证了元素的有序性和较好的查找效率。
unordered_map (无序映射):
- 特点: 基于哈希表实现,查找、插入和删除的平均时间复杂度为 O(1),元素无序。
- 理由: 哈希表的特性使得查找速度快,但不保证元素顺序。
<2> 如何在 C++ 中使用 STL 算法(如排序、查找等)?
排序:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {5, 2, 8, 1, 3};std::sort(numbers.begin(), numbers.end());for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
理由: std::sort 函数接受两个迭代器指定排序范围,对范围内的元素进行排序。
查找:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {5, 2, 8, 1, 3};auto it = std::find(numbers.begin(), numbers.end(), 8);if (it != numbers.end()) {std::cout << "找到了 8" << std::endl;} else {std::cout << "未找到 8" << std::endl;}return 0;
}
理由: std::find 函数返回指向找到元素的迭代器,如果未找到则返回结束迭代器。
<3> 解释 STL 迭代器的概念和作用。
概念: 迭代器是一种用于遍历容器中元素的工具。
作用: 1.提供统一的访问方式,使得不同容器的遍历操作具有相似性;2.解耦算法和容器的具体实现,算法只需通过迭代器操作元素,无需关心容器的内部结构。
<4> C++ 中 map 和 unordered_map 的区别是什么?
存储结构:
map基于红黑树,元素按键有序存储。unordered_map基于哈希表,元素无序存储。
查找效率:
- 平均情况下,
unordered_map的查找、插入和删除操作通常更快,时间复杂度接近 O(1)。 map的查找、插入和删除操作的平均时间复杂度为 O(log n)。
空间占用: unordered_map 通常需要更多的空间来存储哈希表的相关信息。
迭代顺序:
map按照键的升序迭代。unordered_map的迭代顺序是不确定的。
<5> 谈谈 STL 中容器适配器(stack、queue、priority_queue)的使用。
stack (栈):
#include <iostream>
#include <stack>int main() {std::stack<int> myStack;myStack.push(1);myStack.push(2);myStack.push(3);std::cout << "栈顶元素: " << myStack.top() << std::endl;myStack.pop();std::cout << "栈顶元素: " << myStack.top() << std::endl;return 0;
}
理由: push 用于入栈,top 获取栈顶元素,pop 弹出栈顶元素。
queue (队列):
#include <iostream>
#include <queue>int main() {std::queue<int> myQueue;myQueue.push(1);myQueue.push(2);myQueue.push(3);std::cout << "队头元素: " << myQueue.front() << std::endl;myQueue.pop();std::cout << "队头元素: " << myQueue.front() << std::endl;return 0;
}
理由: push 用于入队,front 获取队头元素,pop 弹出队头元素。
priority_queue (优先队列):
#include <iostream>
#include <queue>int main() {std::priority_queue<int> myPriorityQueue;myPriorityQueue.push(1);myPriorityQueue.push(3);myPriorityQueue.push(2);std::cout << "队头元素: " << myPriorityQueue.top() << std::endl;myPriorityQueue.pop();std::cout << "队头元素: " << myPriorityQueue.top() << std::endl;return 0;
}
理由: push 用于入队,top 获取队头元素,pop 弹出队头元素。
<6> 如何自定义 C++ STL 容器的比较函数?
对于 map 或 set 等有序容器:
struct CustomComparator {bool operator()(const int& a, const int& b) {return a % 2 < b % 2; // 按照奇数偶数比较}
};std::map<int, int, CustomComparator> myMap;
对于排序算法:
bool customSort(int a, int b) {return a > b; // 降序排序
}std::vector<int> numbers = {5, 2, 8, 1, 3};
std::sort(numbers.begin(), numbers.end(), customSort);
<7> 描述 C++ 中算法的复杂度分析(时间复杂度和空间复杂度)。
时间复杂度: 表示算法执行所需的时间与输入规模之间的关系。
常见的时间复杂度有:O(1)(常数时间)、O(log n)(对数时间)、O(n)(线性时间)、O(n log n)、O(n^2) 等。
空间复杂度: 表示算法执行所需的额外空间与输入规模之间的关系。
例如,对于 std::sort 函数,其平均时间复杂度为 O(n log n),空间复杂度为 O(log n)。
<8> 举例说明在 C++ 中如何使用 STL 进行数据的批量处理。
假设要对一个整数 vector 中的所有元素进行平方操作:
#include <iostream>
#include <vector>
#include <algorithm>void square(int& num) {num *= num;
}int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};std::for_each(numbers.begin(), numbers.end(), square);for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
<9> 解释 C++ 中函数对象(functor)在 STL 中的应用。
函数对象可以用于传递给 STL 算法作为操作函数。
例如,在 std::sort 中使用自定义的函数对象来定义排序规则:
#include <iostream>
#include <vector>
#include <algorithm>struct DescendingComparator {bool operator()(int a, int b) {return a > b;}
};int main() {std::vector<int> numbers = {5, 2, 8, 1, 3};std::sort(numbers.begin(), numbers.end(), DescendingComparator());for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
<10> 如何解决 C++ 中 STL 容器的迭代器失效问题?
- 对于
vector和deque:
- 在插入或删除元素时,如果导致容器重新分配内存,可能会使迭代器失效。
- 解决方法:在插入或删除操作后,重新获取迭代器。
- 对于
list:
插入和删除操作不会使迭代器失效,只会使指向被删除元素的迭代器失效。
- 对于
map和set等关联容器:
-
插入操作不会使迭代器失效,但删除操作会使指向被删除元素的迭代器失效。
-
解决方法:在删除操作前,先保存需要的迭代器,或者使用返回的新迭代器。
例如,对于 vector:
#include <iostream>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};auto it = numbers.begin() + 2;numbers.insert(numbers.begin() + 2, 6); // 插入可能导致迭代器失效it = numbers.begin() + 3; // 重新获取迭代器std::cout << *it << std::endl;return 0;
}
相关文章:
面试题总结(四) -- STL与算法篇
面试题总结(四) – STL与算法篇 文章目录 面试题总结(四) -- STL与算法篇<1> 请列举 C STL 中常用的容器(如 vector、list、map 等)及其特点。<2> 如何在 C 中使用 STL 算法(如排序、查找等)?<3> 解…...
HashSet及其实现原理
目录 一、Set二、HashSet三、HashSet的实现原理四、HashSet的线程安全与顺序1、线程安全2、有序性 一、Set Set 接口是 java.util 包下的一个集合接口,它继承自 Collection 接口。Set 接口定义了一个不允许包含重复元素的集合。Set 接口的实现类主要有 HashSet、Lin…...
反序列化漏洞练习1
根据代码可以看出来sis类只是接收了参数cmd,下边是通过get获得cmd的值,所以可以在序列化过程中直接为cmd赋值。 根据源码编写序列化代码 <?php class sis{public $cmdsystem("whoami");?>;public function __wakeup(){eval($this-&g…...
树莓派Pico2(RP2350)开发环境搭建
树莓派Pico2(RP2350)开发环境搭建 文章目录 树莓派Pico2(RP2350)开发环境搭建1、RP2350介绍2、开发环境搭建3、工程编译4、固件下载Raspberry Pi再次通过推出RP2350 MCU突破了微控制器设计的界限。这款微控制器是之前RP2040的重大升级,带来了更强大的性能、高级安全功能,…...
vue 路由中使用keepAlive在这个组件中使用onActivated
onMounted: 在组件挂载时触发一次。onActivated: 当 keep-alive 组件从缓存中被激活时触发。如果你将当前组件包裹在 keep-alive 中,激活时会调用此钩子。onDeactivated: 当 keep-alive 组件被缓存时触发。 注意事项 onActivated 只在组件从 keep-alive 缓存中恢复…...
医学数据分析实训 项目一 医学数据采集
项目一 医学数据采集 一、实践目的 了解医学数据的特点;熟悉常见的医学公共数据库的使用方法;掌握获取医学数据的方法; 二、实践平台 操作系统:Windows10 及以上Python 版本:3.8.x 及以上PyCharm 或 Anoconda 集成…...
《Oracle(一)- 基础》
文章目录 一、Oracle简介(一)什么是ORACLE(二)ORACLE 体系结构1.数据库2.实例3.数据文件(dbf)4.表空间5.用户 二、ORACLE 安装与配置(一)VMware 挂载 windows server 2003࿰…...
Unity Resource System 优化笔记
Unity Resources System 定义 Resources System允许开发者在项目中的Resources文件夹下存放一个或多个资源文件夹,并且可以在Unity运行时通过Unity提供的API对资源和对象进行加载和卸载。 如果Resources中的文件结构复杂,内容多,会给应用常…...
Flutter之SystemChrome全局设置
一、简介 SystemChrome作为一个全局属性,很像 Android 的 Application,功能很强大。 二、使用详解 2.1 setPreferredOrientations 设置屏幕方向 在我们日常应用中可能会需要设置横竖屏或锁定单方向屏幕等不同要求,通过 setPreferredOrien…...
Windows11 WSL2的ubuntu 22.04中拉取镜像报错
问题描述 在windows11 WSL2的ubuntu 22.04中拉取镜像报错。错误为: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting header…...
【Linux】多线程:线程同步、条件变量
目录 一、同步的概念 为什么需要同步呢? 二、条件变量 条件变量的相关概念 1、条件变量的初始化:静态初始化、动态初始化 2、条件变量的等待:pthread_cond_wait函数 工作原理及流程【重要!】 关键点总结 3、条件变量的激…...
【Android Studio】使用雷电模拟器调试
文章目录 进入开发者模式使雷电模拟器adb连接PC测试 进入开发者模式 多次点击版本号 -开区USB调试 使雷电模拟器adb连接PC 写cmd脚本 雷电模拟器端口为5555 ,脚本内容如下: adb.exe connect 127.0.0.1:5555双击bat脚本文件 测试...
你必须知道的C语言问题(9)
问:如下代码,两个结构体类型成员变量相同,只是成员顺序不同,为什么大小不同? #include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h>typedef struct _test1{uint…...
如何通过网络找到自己想要的LabVIEW知识?
学习LabVIEW或其他编程技术时,无法依赖某一篇文章解决所有问题。重要的是通过多种途径获取灵感,并学会归纳总结,从而逐渐形成系统性的理解。这种持续学习和总结的过程是技术提升的基础。通过网络找到所需的LabVIEW知识可以通过以下几个步骤进…...
SCRM电商管理后台Axure高保真原型 源文件
在电商行业蓬勃发展的今天,企业急需一个全面的客户关系管理(CRM)系统来优化他们的电商运营。我们的Scrm电商管理后台应运而生,它不仅是一个集中化的管理平台,更是企业提升客户互动和销售业绩的得力助手。 预览地址 ht…...
重载new,delete , RTTI,类成员指针
重载new,delete 执行过程 重载new,delete 和普通的运算符重载不同,并非重载new,delete 的行为,而是改变内存分配的方式,将对象放置在特定的内存空间中 new运算符操作: 调用STL标准模板库的…...
基于SSM+Vue+MySQL的在线医疗服务系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着医疗信息化的快速发展和患者对便捷医疗服务需求的日益增长,开发一个高效、可靠的在线医疗服务系统显得尤为重要。基于SSM(SpringSpring MVCMyBatis)框架、前端采用Vue.js、后端连接MySQL数…...
Windows 11上pip报‘TLS/SSL connection has been closed (EOF) (_ssl.c:1135)‘的解决方法
这个只是简单记录一下,可能是我用了代理的缘故,即便是把源换成国内的,例如阿里云,也会报错,例如: pip install matplotlib Looking in indexes: https://mirrors.aliyun.com/pypi/simple/, https://pypi.or…...
53 - I. 在排序数组中查找数字 I
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9853%20-%20I.%20%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E5%AD%97%20I/README.md 面试题 53 - I. 在排序数组中查找数字 …...
基于 TDMQ for Apache Pulsar 的跨地域复制实践
导语 自2024年9月6日起,TDMQ Pulsar 版专业集群支持消息、元数据两级跨地域复制功能,消息级复制解决用户全球地域的数据统一归档问题,元数据级复制提供解决用户核心业务跨地域容灾的场景。 用户在跨地域场景遇到的疑问和挑战 在跨地域相关…...
泛微OA字段联动与JS代码顺序控制的实战技巧:如何避免数据遍历中的坑
泛微OA字段联动与JS代码顺序控制的实战技巧:如何避免数据遍历中的坑 在泛微OA系统的二次开发中,字段联动和JS代码控制是提升表单交互性的两大核心功能。但当这两个功能需要在同一业务流程中协同工作时,开发者常常会遇到一个棘手的问题&#x…...
TYPE3-CAAV5如何革新CATIA中的文本与投影设计流程
1. TYPE3-CAAV5如何改变CATIA设计流程的游戏规则 第一次在CATIA里用TYPE3-CAAV5创建文本时,我盯着屏幕愣了三秒——原来工程软件的操作还能这么流畅!这个看似简单的工具条彻底颠覆了我对CAD文本处理的认知。传统CATIA里需要切换多个模块才能完成的文本操…...
PPO-Lag在Velocity-Walker2d任务中周期性震荡的原因分析与解决方案
PPO-Lag在Velocity-Walker2d任务中周期性震荡的机制解析与调优实践 当你在Velocity-Walker2d环境中观察到训练曲线像心电图一样规律起伏时,很可能正遭遇PPO-Lag算法的经典震荡问题。这种周期性波动不仅影响策略收敛效率,更可能掩盖算法在安全约束处理上的…...
ESP32-S3项目实战:从Github下载‘小智’代码到成功烧录的完整避坑记录
ESP32-S3项目实战:从Github下载‘小智’代码到成功烧录的完整避坑记录 在物联网开发领域,ESP32-S3凭借其出色的性能和丰富的外设接口,成为众多开发者的首选。本文将带你完整走一遍从Github获取"小智"开源项目到最终烧录运行的整个流…...
终极RAID启动指南:Ventoy如何简化复杂存储阵列的系统引导
终极RAID启动指南:Ventoy如何简化复杂存储阵列的系统引导 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 你是否曾为从RAID阵列启动系统而烦恼?传统的BIOS配置和驱动程序加载过…...
杰理之变声接口异常死机问题【篇】
void audio_voice_changer_mode_switch(u16 uuid, char *name, VOICE_CHANGER_MODE mode)...
C++编译产物为何在边缘端频繁触发OOM?深度解析.lto、.eh_frame、.comment段的隐藏开销(含Bloaty对比报告)
第一章:C编译产物在边缘端触发OOM的根本动因边缘设备普遍受限于物理内存(如 512MB–2GB RAM)、无 Swap 分区、缺乏内存过载保护机制,而现代 C 编译器(如 GCC 11/Clang 14)默认启用的优化策略与运行时特性&a…...
文本文件批量转 UTF-8 与「仅检测编码」操作备忘
需要在 Windows 桌面端对一批文本类文件统一编码或先摸清当前编码时,可以用【批量文件编码转换工具】。下文只记界面流程与注意点,不写检测与转换的实现细节。源路径支持拖入文件或文件夹、多次追加,也可用浏览菜单选文件夹、单文件或多文件。…...
效率提升神器:用快马AI自动诊断并修复npm 128错误,节省排错时间
效率提升神器:用快马AI自动诊断并修复npm 128错误,节省排错时间 最近在团队协作开发一个Node.js项目时,频繁遇到npm安装依赖报错128的问题。每次都要花大量时间排查SSH配置、网络代理或仓库源的问题,严重影响了开发效率。于是我开…...
3步掌握TIDAL无损音乐下载:打造个人高品质音乐库的智能助手
3步掌握TIDAL无损音乐下载:打造个人高品质音乐库的智能助手 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 还在为无法离线保存…...
