std::pair 是用于打包两个不同类型值的轻量级结构体模板,适用于临时绑定键值、函数返回多值或哈希表自定义键等场景;访问用 .first/.second,支持结构化绑定(C++17),但无命名字段、不可跨ABI传递。

std::pair 是什么,什么时候该用它
它不是容器,也不是智能指针,就是一个轻量级的结构体模板,专门用来打包两个类型可能不同的值。当你需要把 key 和 value 临时绑在一起、函数要返回两个东西、或者写哈希表自定义键时,std::pair 就比手写 struct 省事得多。
别把它当万能胶——如果两个字段语义差别大(比如 user_id 和 last_login_time),长期看还是用命名清晰的 struct 更安全;std::pair 适合临时性、通用性场景。
怎么构造和访问 std::pair
最常用的是 std::make_pair(),编译器能自动推导类型,不用写模板参数:
auto p = std::make_pair(42, "hello"); // 推出 pair<int, const char*>
也可以显式构造:
立即学习“C++免费学习笔记(深入)”;
std::pair<int, std::string> p{100, "ok"};
访问字段只能用 .first 和 .second,没有 getter 方法,也不能重命名:
-
p.first永远是第一个模板参数类型,p.second永远是第二个 - 不能写
p.key或p.value—— 那是 map 的迭代器解引用结果,不是std::pair本身 - 如果需要移动语义(比如存
std::unique_ptr),记得用std::move()构造,否则会编译失败
常见错误:和 std::tuple、std::map::value_type 混用
错误现象:error: no matching function for call to 'make_pair' 或运行时取错字段。
原因常是类型不匹配或误以为 std::pair 有顺序灵活性:
-
std::tuple支持 >2 个元素,但std::pair固定两个;想存三个值别硬套 pair -
std::map<K,V>::value_type确实是std::pair<const K, V>,但注意first是const—— 所以it->first = ...会报错 - 用
auto&接 map 迭代器解引用时,first仍是 const,别试图修改 key
性能和兼容性要注意什么
std::pair 几乎零开销:它没虚函数、没动态分配、内存布局就是两个字段紧挨着,和 C struct 一样。
但有几个边界情况得留神:
- 如果两个成员类型都有非平凡构造/析构(比如含
std::string),那std::pair的构造成本就等于两者之和 - C++17 起支持结构化绑定:
auto [x, y] = p;,但老项目若还在用 C++11,就得老老实实用.first/.second - 跨 DLL 或 ABI 边界传递
std::pair不安全——标准没规定其二进制布局,建议只在模块内部用
真正容易被忽略的是:它不提供比较操作符重载(除了 == 和 < 等默认字典序),如果要用作 map 键且逻辑比较复杂,得自己写 operator< 或传比较函数。










