std::pair 是 STL 提供的轻量级成对数据容器,用于打包两个固定类型的值,适用于函数返回双值、map 键值对或临时配对;创建推荐 std::make_pair 或花括号初始化,访问用 .first/.second;C++17 支持结构化绑定;默认按 first 再 second 字典序比较。

pair 是什么,什么时候该用它
std::pair 是 STL 提供的最轻量级的成对数据容器,本质就是两个固定类型的值打包在一起,比如 std::pair<int, std::string> 表示一个整数加一个字符串的组合。它不适用于需要动态增删字段或多个字段的场景,但特别适合函数返回两个值、哈希表键值对(std::map 内部就用 pair<const Key, Value>)、或者临时配对传递参数。
常见错误是把它当结构体用——比如存三个字段还硬塞进 pair<int, pair<string, double>>,可读性和维护性立刻变差,这时该用 struct 或 std::tuple。
怎么创建和访问 pair
创建方式有三种,优先用 std::make_pair 或直接初始化:
-
auto p1 = std::make_pair(42, "hello");—— 类型自动推导,最常用 -
std::pair<int, std::string> p2(42, "hello");—— 显式类型,需写全 -
std::pair<int, std::string> p3{42, "hello"};—— C++11 起支持,推荐用于初始化
访问成员只能通过 .first 和 .second,没有命名字段:
立即学习“C++免费学习笔记(深入)”;
-
p1.first是int,p1.second是std::string - 注意:不能写
p1.key或p1.value,那是 map 迭代器解引用后才有的别名
make\_pair 为什么比直接构造更安全
std::make_pair 的核心优势是类型自动退化处理,尤其在传入 const 引用或临时对象时避免意外拷贝或绑定失败:
-
std::make_pair(std::string("abc"), 3.14)→ 推导为pair<std::string, double> - 而
std::pair<std::string, double>(std::string("abc"), 3.14)写法冗长且易错
容易踩的坑:
- 传入左值引用时,
make_pair默认按值复制;如需引用语义,得显式写std::ref(x)或用std::pair<T&, U&>(极少用) - C++17 后支持结构化绑定:
auto [a, b] = p1;,但注意a和b是拷贝,不是引用(除非声明为auto& [a, b])
pair 在 map 和 sort 中的实际用途
std::map 的迭代器解引用返回的就是 std::pair<const Key, Value>,所以常这么写:
-
for (const auto& kv : my_map) { std::cout << kv.first << ": " << kv.second; }
排序时,std::pair 默认按 first 升序,first 相等再比 second:
-
std::vector<std::pair<int, std::string>> v = {{2,"b"}, {1,"a"}, {1,"z"}}; -
std::sort(v.begin(), v.end());→ 结果是{1,"a"}, {1,"z"}, {2,"b"}
性能上,pair 是 POD 类型,无额外开销;但若其中某个类型很大(比如含长字符串),赋值/移动成本就取决于那个成员的实现。
实际编码中,最容易被忽略的是 pair 的比较逻辑——它不关心字段语义,只做字典序逐项比较。如果你需要按 second 主序排序,就得写自定义比较函数,而不是依赖默认行为。










