华为20240821笔试第一题笔记
https://mp.weixin.qq.com/s?__biz=MzkyNTQ3NDAzNw==&mid=2247489703&idx=1&sn=96d3f883998b4bbb395dfc5f08906399&chksm=c02307cb0d07e5b4e7140350b08b20bd7b5ba950886d62a60f44af3bc6c070c1031827edc979&mpshare=1&scene=1&srcid=0821m7WJaqagZZ55Edw4FMUm&sharer_shareinfo=71cf0131d731c3e6876a752bd4a99516&sharer_shareinfo_first=71cf0131d731c3e6876a752bd4a99516#rd
以上是题目链接
1. 将 map 转换为 vector
vector<pair<vector<int>, pair<int, int>>> sorted_res(res.begin(), res.end());
res 是一个 map,其键是一个 vector<int>(表示一个数据块),值是一个 pair<int, int>(表示该块首次出现的下标及出现次数)。
vector<pair<vector<int>, pair<int, int>>> 是一个向量,其元素是与 map 的键值对相同的类型。
通过 res.begin() 和 res.end() 初始化 sorted_res,实际上是将 map 中的所有元素复制到 vector 中。这样做的原因是 vector 可以进行排序操作,而 map 本身是按键(即块内容)排序的,不支持按值排序。
2. 按首次出现的下标排序
sort(sorted_res.begin(), sorted_res.end(), [](const auto &a, const auto &b) { return a.second.first < b.second.first; });
-
sort是一个标准库函数,用于对vector中的元素进行排序。 -
第三个参数是一个 lambda 表达式,定义了排序的依据。
-
[](const auto &a, const auto &b)是一个 lambda 表达式,表示一个匿名函数。它接收两个参数a和b,这两个参数是sorted_res中的元素类型的常量引用。 -
在本例中,
a和b是pair<vector<int>, pair<int, int>>类型的元素。 -
return a.second.first < b.second.first;语句返回一个布尔值:- 如果
a在原始数据中首次出现的下标小于b,则返回true,表示a应该排在b之前。 - 否则返回
false
- 如果
更具体的问题
1. map 中的块数据及其出现信息如何转移到 vector 中?
map 和 vector 的数据结构
-
map: 在这段代码中,map<vector<int>, pair<int, int>> res是一个字典结构,它将vector<int>类型的键(表示一个数据块)映射到pair<int, int>类型的值(表示该块在原始序列中的首次出现位置和出现次数)。
例如,res中的一个元素可能是:{ {1, 2, 3}, {0, 2} }。
这表示数据块[1, 2, 3]首次出现在原始序列的第0个位置,并且该块在序列中出现了2次。 -
vector:vector<pair<vector<int>, pair<int, int>>> sorted_res是一个动态数组,其中每个元素都是一个pair。pair的第一个元素是一个vector<int>(数据块),第二个元素是一个pair<int, int>(块的首次出现位置和出现次数)。
例如,sorted_res中的一个元素可能是:({1, 2, 3}, {0, 2})。
数据转移的过程
vector<pair<vector<int>, pair<int, int>>> sorted_res(res.begin(), res.end());
res.begin()和res.end()分别返回指向map开始和结束的迭代器。map中的每个元素是一个pair,其第一个元素是键(数据块vector<int>),第二个元素是值(pair<int, int>)。vector的构造函数接受两个迭代器作为参数,将map中的所有元素复制到vector中。因此,sorted_res就包含了res中的所有键值对,数据形式保持不变。
2. pair 的数据形式及作用
pair 是 C++ 标准库中的一个模板类,用于存储一对值。它的定义如下:
template <class T1, class T2> struct pair { T1 first; T2 second; };
- 数据形式:
pair<T1, T2>表示存储两个不同类型的对象T1和T2。 - 用途:
pair常用于需要将两个相关联的对象组合在一起时。例如,可以将一个int和一个string组合在一起存储。
3. const auto & 的数据类型
auto: 是 C++11 引入的一个自动类型推导关键字,编译器会根据上下文推断出变量的类型。const: 表示变量是常量,不可修改。&: 表示该变量是一个引用,避免了拷贝,提高了效率。
const auto & 是一种组合使用的形式,用来声明一个变量为 常量引用,编译器会自动推导其具体类型。
在 sort 函数中的使用是为了避免拷贝 pair 对象(a 和 b),提高代码效率,同时保证它们不会被修改。
在这段代码中,a 和 b 的类型会被推导为 const pair<vector<int>, pair<int, int>> &。也就是说,它们是指向 vector 元素的常量引用。
4. sort 的其他使用场景及示例
std::sort 是 C++ 标准库提供的排序函数。它有多种形式,通常使用以下形式:
sort(begin_iterator, end_iterator, compare_function);
begin_iterator和end_iterator:要排序的范围。compare_function:一个比较函数或 lambda 表达式,决定排序顺序。
5.#include <tuple>是什么?
#include <tuple> 是 C++ 标准库中的一个头文件,它提供了模板类 std::tuple 的定义。std::tuple 是一个通用的集合类,可以用来存储任意数量和类型的元素。这使得 tuple 类比 pair 更加灵活,因为 pair 只能存储两个元素,而 tuple 可以存储多个元素。
#include <pair> 是错误的,因为 C++ 标准库中没有一个专门的头文件叫做 <pair>。
std::pair 是定义在 <utility> 头文件中的。要使用 std::pair,你需要包含 <utility> 头文件:
6.size_t和auto的区别
区别
| 特性 | size_t | auto |
|---|---|---|
| 定义 | 无符号整数类型,用于表示对象大小或数组索引。 | 关键字,用于自动类型推导。 |
| 用途 | 用于表示非负整数,通常与内存大小或数组索引相关。 | 用于自动推导变量的类型。 |
| 使用场景 | 适用于需要表示大小、长度、索引的场景。 | 适用于任何类型推导场景,简化代码编写。 |
| 示例 | size_t index = 0; |
auto x = 5; 或 auto it = vec.begin(); |
size_t是一个固定的无符号整数类型,专门用于表示大小和索引。auto是一个自动类型推导关键字,编译器会根据初始化表达式自动确定类型。
size_t 和 auto 用于不同的场景:size_t 适合在需要表示内存相关大小或索引时使用,而 auto 则在任何需要简化类型声明的场景下都可以使用。
浙公网安备 33010602011771号