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
则在任何需要简化类型声明的场景下都可以使用。