本文介绍了C++中的关联式容器及其核心概念——键值对(pair)。关联式容器与序列式容器的主要区别在于其通过键(key)来高效查找、插入和删除元素,底层通常采用平衡二叉搜索树或哈希表实现。文章重点讲解了pair的结构、构造函数以及简化操作的make_pair函数。
首先了解一下我们之前学的string,vector,list,queue等容器。
什么是序列式容器? 这些容器的底层逻辑结构为线性序列的数据结构,存储的是元素本身,所以称之为
序列式容器。 两个位置的储存值之间一般没有紧密的联系,比如交换一下他们依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的
我们这章所学的map / set 系列和后续会讲解的 unordered_map / unordered 系列都属于是关联式容器。
那么什么是关联式容器? 关联式容器用于存储 键值对 (
<key, value>),与序列式容器不同,关联式容器的元素通过 键 来查找、插入和删除。它们通常采用 平衡二叉搜索树(如map、set的红黑树实现)或 哈希表(如unordered_map、unordered_set)来实现,因此在 查找、插入和删除 等操作时,比序列式容器更高效,时间复杂度通常为对数级别(O(log n)或O(1))。常见的关联式容器包括map、set、multimap、multiset以及使用哈希表实现的unordered_map和unordered_set。 它的底层逻辑结构是非线性的,两个位置的储存值之间是紧密关联的,如果交换他们的值就会破坏其储存结构。
键值对(Key-Value Pair)是指由 键(Key)和 值(Value)组成的元素结构。键是唯一标识元素的标志,而值则是与该键相关联的数据。常见的关联式容器(如
map、unordered_map)存储的就是这种键值对结构。
map<int, string> 存储的键值对可能是 {1, "apple"},其中 1 是键,"apple" 是与该键相关的值。通过键,我们可以快速查找到对应的值。

pair的基本结构
template <class T1, class T2>
struct pair
{
typedef T1 first_type; // 定义第一个类型的别名
typedef T2 second_type; // 定义第二个类型的别名
T1 first; // 第一个元素
T2 second; // 第二个元素
// 默认构造函数,使用默认构造函数初始化 first 和 second
pair() : first(T1()), second(T2()) {}
// 带参数的构造函数,用给定的值初始化 first 和 second
pair(const T1& a, const T2& b) : first(a), second(b) {}
};
默认构造
// 默认构造函数:初始化 `first` 和 `second` 成员为各自类型的默认值
pair();
// 实现:通过默认构造函数初始化 `first` 和 `second` 成员
pair() : first(T1()), second(T2()) {}
// `T1()` 和 `T2()` 是类型 T1 和 T2 的默认构造函数,
// 它们会被调用来初始化 `first` 和 `second`。
// 如果 `T1` 或 `T2` 是类类型,默认构造函数会被调用。
// 如果是基本类型(如 `int`),则 `first` 和 `second` 会被初始化为 0。拷贝构造
// 拷贝构造函数:通过拷贝另一个 `pair` 对象来初始化当前对象
template<class U, class V>
pair(const pair<U, V>& pr);
// 实现:用另一个 `pair<U, V>` 对象的 `first` 和 `second` 成员来初始化当前 `pair` 对象
pair(const pair<U, V>& pr) : first(pr.first), second(pr.second) {}
// `pr.first` 和 `pr.second` 分别是传入的 `pair` 对象的 `first` 和 `second` 成员。
// 当前对象的 `first` 和 `second` 会被初始化为这些值。
// 注意:`U` 和 `V` 是临时 `pair` 对象的类型,可以不同于当前 `pair` 的类型,但必须能够赋值。带参数构造
// 带参数构造函数:用指定的值初始化 `first` 和 `second` 成员
pair(const first_type& a, const second_type& b);
// `first_type` 和 `second_type` 是 `pair` 中 `first` 和 `second` 成员的类型。
// `a` 和 `b` 分别是初始化这两个成员的值。//手动构造
std::map<int, std::string> m;
m.insert(std::pair<int, std::string>(1, "apple"));std::map<int, std::string> m;
m.insert(std::make_pair(1, "apple"));make_pair函数:自动推导类型,简化pair对象的创建
使用对比:
// 繁琐的手动构造
m.insert(std::pair<int, std::string>(1, "apple"));
// 简化的自动推导
m.insert(std::make_pair(1, "apple"));关联式容器及其键值对机制是C++中实现高效数据检索的重要工具,特别适用于需要快速查找的场景。