面试题总结(四) -- 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 容器的比较函数?

对于 mapset 等有序容器:

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 容器的迭代器失效问题?

  1. 对于 vectordeque:
  • 在插入或删除元素时,如果导致容器重新分配内存,可能会使迭代器失效。
  • 解决方法:在插入或删除操作后,重新获取迭代器。
  1. 对于 list

插入和删除操作不会使迭代器失效,只会使指向被删除元素的迭代器失效。

  1. 对于 mapset 等关联容器:
  • 插入操作不会使迭代器失效,但删除操作会使指向被删除元素的迭代器失效。

  • 解决方法:在删除操作前,先保存需要的迭代器,或者使用返回的新迭代器。

例如,对于 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;
}

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

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

相关文章

QUIC的loss detection学习

PTO backoff backoff 补偿 /ˈbkɒf/PTO backoff 是QUIC&#xff08;Quick UDP Internet Connections&#xff09;协议中的一种机制&#xff0c;用于处理探测超时&#xff08;Probe Timeout, PTO&#xff09;重传策略 它逐步增加探测超时的等待时间&#xff0c;以避免网络拥塞…

[网络]http请求中的URL,方法,header 和 http响应中的状态码

文章目录 一. http请求1. 认识URLurlencode 2. 认识方法应用场景构造http请求 2. 认识请求报头header 二. http响应1. 状态码 一. http请求 1. 认识URL 我们所说的"网址", 其实就是URL(Uniform Resource Locator 统⼀资源定位符) 1.协议方案名 常见的有http和http…

警惕!甲状腺病的早期“信号弹”,你捕捉到了吗?

在快节奏的现代生活中&#xff0c;健康问题往往被忽视&#xff0c;尤其是那些初期症状不明显、容易被误解或忽视的疾病。甲状腺&#xff0c;这个位于颈部下方、形状如蝴蝶的小腺体&#xff0c;虽然不起眼&#xff0c;却是人体内分泌系统中的重要一员&#xff0c;负责调节新陈代…

AIGC:python 文生图代码(python + stable-diffusion+ cuda)

解决什么问题 搭建一个文生图环境 + python文生图代码,通过输入prompt,生成图片 解决方法 文生图的代码比较简易,主要是搭建环境+下载文生图大模型 步骤一: 创建虚拟环境(用python 3.10版本,起得名字最好可以一看就知道Python的版本) conda create -n text2img3.10 py…

【RAG】RAG再进化?基于长期记忆的检索增强生成新范式-MemoRAG

前言 RAG现在工作很多&#xff0c;进化的也很快&#xff0c;再来看看一个新的RAG工作-MemoRAG。 文章提出&#xff0c;RAG在减少大模型对于垂类知识的问答幻觉上取得了不错的效果&#xff0c;也成为私域知识问答的一种范式。然而&#xff0c;传统RAG系统主要适用于明确信息需…

HTML5超酷炫的水果蔬菜在线商城网站源码系列模板1

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/142059238 HTML5超酷炫的水果蔬菜在线商城网…

LSS中的BevEncoder

LSS中的BevEncoder其实很简单,主要是使用了resnet18来提取生成的(200x200)BEV图中的bev特征。 class BevEncode(nn.Module):def __init__(self, inC, outC):super(BevEncode

深入理解Go语言中的接口定义与使用

在Go语言的编程实践中&#xff0c;接口&#xff08;Interface&#xff09; 是一个强大而灵活的特性&#xff0c;它允许我们定义一组方法&#xff0c;而不需要指定这些方法的具体实现。通过接口&#xff0c;我们可以将不同类型的值组合在一起&#xff0c;只要它们实现了接口中定…

软件工程毕业设计开题汇总

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 大数据电商…

Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解

目录 一、Linux软件包管理器 - yum&#xff08;ubuntu用apt代替yum&#xff09;1、Linux下安装软件的方式2、认识 yum3、查找软件包4、安装软件5、如何实现本地机器和云服务器之间的文件互传 二、Linux编辑器 - vim1、vim 的基本概念2、vim 下各模式的切换3、vim 命令模式各命令…

WebGL系列教程八(GLSL着色器基础语法)

目录 1 前言2 基本原则3 基本数据类型4 顶点着色器和片元着色器4.1 声明4.2 初始化项目4.3 赋值 5 结构体5.1 声明5.2 赋值 6 函数6.1 基本结构6.2 自定义函数6.3 常用内置函数 7 精度8 其他9 总结 1 前言 通过前七讲&#xff0c;我们已经见过了WebGL中的部分基础语法&#xff…

C/C++语言基础--从C到C++的不同(上)

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 之前更新的C语言&#xff0c;感谢大家的点赞收藏关注&#xff0c;接下来我们逐步也开始更新C&#xff1b;C语言后面也会继续更新知识点&#xff0c;如内联汇编&#xff1b;本人现在正在写一个C语言的图书管理系…

Java语言程序设计——篇十一(3)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

Google大数据架构技术栈

数据存储层 Colossus Colossus作为Google下一代GFS&#xff08;Google File System&#xff09;。 GFS本身存在一些不足 单主瓶颈 GFS 依赖单个主节点进行元数据管理&#xff0c;随着数据量和访问请求的增长&#xff0c;出现了可扩展性瓶颈。想象一下&#xff0c;只有一位…

人工智能——猴子摘香蕉问题

一、实验目的 求解猴子摘香蕉问题&#xff0c;根据猴子不同的位置&#xff0c;求解猴子的移动范围&#xff0c;求解对应的过程&#xff0c;针对不同的目标状态进行求解。 二、实验内容 根据场景有猴子、箱子、香蕉&#xff0c;香蕉挂天花板上。定义多种谓词描述位置、状态等…

Git使用详解:从安装到精通

前言 什么是Git Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使用。 可以理解&#xff1a; git是一个管理源代码的工具&#xff0c;主要用于企业团队开…

c语言 —— 结构变量

1.结构变量的定义 类型和变量是不同的概念,只能对变量进行赋值、存取或运算操作,而不能对一个类型进行这些操作。因此在声明了结构类型后,还需要定义结构变量,以便在程序中引用它。结构变量和其他变量一样,必须先定义后使用,定义方法有以下3种: (1)先定义结构类型,再定…

Python编码系列—Python原型模式:深克隆与高效复制的艺术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

通信工程学习:什么是FDMA频分多址

FDMA&#xff1a;频分多址 FDMA&#xff08;Frequency Division Multiple Access&#xff0c;频分多址&#xff09;是一种在无线通信领域广泛应用的多址技术。该技术通过将可用的频谱资源按频率划分&#xff0c;把传输频带划分为若干较窄且互不重叠的子频带&#xff08;或称信道…

【C语言】malloc()函数详解(动态内存开辟函数)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.malloc()函数简介 1.函数功能 2.函数参数 &#x1f4cc;size_t size 3.函数返回值 4.函数头文件 5.函数生成空间(与calloc区别) 二.malloc()函数的具体使用 1.使…