面试题总结(四) -- 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 版专业集群支持消息、元数据两级跨地域复制功能,消息级复制解决用户全球地域的数据统一归档问题,元数据级复制提供解决用户核心业务跨地域容灾的场景。 用户在跨地域场景遇到的疑问和挑战 在跨地域相关…...

无线通信感知/雷达系统算法专业技术栈
无论是在工业界还是在学业界,无线通信感知一体化都是一个热门的方向,作为一个24届毕业生,刚好处于行业当中,就总结一下自己浅薄认知下,自己觉得已经掌握或者应该掌握的技术栈和专业能力,与大家共勉。 Rada…...

离谱碾压!奇安信中标:高出第二名近70分!
2024年08月09日,广东省政务服务和数据管理局,近日发布了网络安全第三方服务(2024年)项目之关基检查及重要政务应用安全检查服务招标公告! 预算金额:2,896,200.00元,其中安全检查服务包…...

HOT 100(七)栈、堆、贪心算法
一、栈 1、每日温度 使用单调递减栈来解决。主要思路是遍历temperatures数组,利用栈来存储还没有找到比当前温度高的天数的索引。当遇到比栈顶索引所对应温度更高的温度时,就可以确定当前这一天的温度比之前那一天高。索引的差值就是等待的天数。 求一…...

速盾:高防服务器租用需要注意什么事项
在当今互联网时代,网络安全问题日益严峻。各种网络攻击手段层出不穷,给企业和个人的网站带来了巨大的安全威胁。为了保障网站的安全稳定运行,高防服务器成为了许多人的选择。而在租用高防服务器时,需要注意以下几个事项。 一、选择…...

【数据库】MySQL内置函数
本篇分享一些在MySQL中常见的一些内置函数,如日期函数,字符串函数和数学函数,以方便于操作数据库中的数据。 1.日期函数 我们先整体观察一下这些函数再讲解案例 日期函数使用起来都非常就简单 获得年月日: select current_dat…...

Promise查漏及回调地狱结构优化
目录 前言一、执行器函数的执行顺序二、如何在then()中抛出错误三、期约的"非重入"特性四、串行化期约五、应对回调地狱结语 前言 依据《JavaScript高级程序设计》对Promise期约相关进行查缺补漏. 一、执行器函数的执行顺序 执行器函数虽作为期约的参数, 却是期约的…...

SpringCloud-05 Resilience4J 服务降级和熔断
服务雪崩:指在多个服务之间存在依赖关系时,当一个服务发生故障或不可用时,导致其他服务也无法正常工作的情况。这种现象通常是因为服务之间的依赖关系过于紧密,当一个服务发生故障时,其他服务无法正确处理该服务的请求…...

哈希表、算法
哈希表 hash: 在编程和数据结构中,"hash" 通常指的是哈希函数,它是一种算法,用于将数据(通常是字符 串)映射到一个固定大小的数字(哈希值)。哈希函数在哈希表中尤为重要…...

变更AWS EC2 实例配置或实例类型
在本文中,九河云将带您了解如何更改由 Amazon Elastic Block Store (EBS) 支持的 Amazon Elastic Compute Cloud (EC2) 实例的类型。更改实例类型可以优化成本和性能,使其更符合您的应用程序需求。 准备工作 在开始之前,请确保您已完成以下…...

【前端】ref引用的作用
首先,我们要明确一点,使用vue的好处是: 想要减少开发者直接操作dom元素。使用组件模版,实现代码的服用。 ref的属性的实现是为了取代原生js中使用id、class等标识来获取dom元素。 helloworld组件 <template><div clas…...