华为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 表达式,表示一个匿名函数。它接收两个参数 ab,这两个参数是 sorted_res 中的元素类型的常量引用。

  • 在本例中,abpair<vector<int>, pair<int, int>> 类型的元素。

  • return a.second.first < b.second.first; 语句返回一个布尔值:

    • 如果 a 在原始数据中首次出现的下标小于 b,则返回 true,表示 a 应该排在 b 之前。
    • 否则返回 false

更具体的问题

1. map 中的块数据及其出现信息如何转移到 vector 中?

mapvector 的数据结构

    • 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 是一个动态数组,其中每个元素都是一个 pairpair 的第一个元素是一个 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> 表示存储两个不同类型的对象 T1T2
  • 用途: pair 常用于需要将两个相关联的对象组合在一起时。例如,可以将一个 int 和一个 string 组合在一起存储。

3. const auto & 的数据类型

  • auto: 是 C++11 引入的一个自动类型推导关键字,编译器会根据上下文推断出变量的类型。
  • const: 表示变量是常量,不可修改。
  • &: 表示该变量是一个引用,避免了拷贝,提高了效率。

const auto & 是一种组合使用的形式,用来声明一个变量为 常量引用,编译器会自动推导其具体类型。
sort 函数中的使用是为了避免拷贝 pair 对象(ab),提高代码效率,同时保证它们不会被修改。

在这段代码中,ab 的类型会被推导为 const pair<vector<int>, pair<int, int>> &。也就是说,它们是指向 vector 元素的常量引用。

4. sort 的其他使用场景及示例

std::sort 是 C++ 标准库提供的排序函数。它有多种形式,通常使用以下形式:

sort(begin_iterator, end_iterator, compare_function);
  • begin_iteratorend_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_tauto
定义 无符号整数类型,用于表示对象大小或数组索引。 关键字,用于自动类型推导。
用途 用于表示非负整数,通常与内存大小或数组索引相关。 用于自动推导变量的类型。
使用场景 适用于需要表示大小、长度、索引的场景。 适用于任何类型推导场景,简化代码编写。
示例 size_t index = 0; auto x = 5;auto it = vec.begin();

 

  • size_t 是一个固定的无符号整数类型,专门用于表示大小和索引。
  • auto 是一个自动类型推导关键字,编译器会根据初始化表达式自动确定类型。

size_tauto 用于不同的场景:size_t 适合在需要表示内存相关大小或索引时使用,而 auto 则在任何需要简化类型声明的场景下都可以使用。

posted @ 2024-08-29 18:06  axuu  阅读(6)  评论(0编辑  收藏  举报