ACM/ICPC竞赛STL--pair

ACM模版

pair

STL的<utility>头文件中描述了一个看上去非常简单的模版类pair,用来表示一个二元组或元素对,并提供了按照字典序对元素对进行大小比较运算符模版函数。
Example,想要定义一个对象表示一个平面坐标点,则可以:

pair<double, double> p;
cin >> p.first >> p.second;

pair模版类需要两个参数:首元素的数据类型和尾元素的数据类型。pair模版类对象有两个成员:first和second,分别表示首元素和尾元素。
在<utility>中已经定义了pair上的六个比较运算符:<、>、<=、>=、==、!=,其规则是先比较first,first相等时再比较second,这符合大多数应用的逻辑。当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。
除了直接定义一个pair对象外,如果需要即时生成一个pair对象,也可以调用在<utility>中定义的一个模版函数:make_pair。make_pair需要两个参数,分别为元素对的首元素和尾元素。

Ugly Numbers的实现代码中,就可以用pair来表示推演树上的结点,first表示结点的值,用second表示结点是由父结点乘以哪一个因子得到的。

<utility>看上去是一个很简单的头文件,但是<utility>的设计中却浓缩反映了STL设计的基本思想。有意深入了解和研究STL的朋友,仔细阅读和体会这个简单的头文件,不失为一种入门的途径。

<think>好的,用户问的是关于C++中的make_pair。我需要详细解释这个函数的作用、用法以及它在标准库中的位置。首先,make_pair是一个模板函数,位于std命名空间,通常用于构造pair对象。它接受两个参数,自动推导类型,省去显式指定模板参数的麻烦。比如,使用make_pair(1, 3.14)会比直接写pair<int, double>(1, 3.14)更方便。 接下来,我需要说明它的用途,比如在需要pair的地方,如map的插入操作,或者返回两个值的函数中。可能还要提到C++11之后的改进,比如通过右值引用和完美转发优化,以及如何自动推导出正确的类型,包括处理引用的情况。 然后,给出示例代码,展示基本使用、作为函数返回值、在容器中的应用,以及在C++11中如何自动推导类型,比如用auto接收返回的pair。还要注意类型推导可能带来的问题,比如当参数是引用时,可能需要使用ref或cref来保持引用类型。 最后,相关问题需要覆盖pair的其他方面,比如构造方法、与其他容器的结合使用、结构体绑定、类型推导细节等,确保问题有层次,帮助用户深入理解相关知识点。</think><< `std::make_pair` 是 C++ 标准库 `<utility>` 头文件中提供的模板函数,用于快速构造 `std::pair` 对象。它通过自动推导参数类型,避免显式指定模板参数。 ### 核心作用 1. **自动类型推导**:无需手动声明 `pair` 的类型参数 2. **简化代码**:比直接构造 `pair` 更简洁 3. **兼容性**:支持 C++11 后的移动语义和完美转发 ### 基本用法示例 ```cpp #include <utility> #include <iostream> int main() { // 自动推导为 std::pair<int, double> auto p1 = std::make_pair(42, 3.14159); // 显式类型声明的等价写法 std::pair<int, double> p2(42, 3.14159); std::cout << p1.first << ", " << p1.second << '\n'; } ``` ### 典型应用场景 1. **STL 容器操作**: ```cpp std::map<int, std::string> m; m.insert(std::make_pair(1, "Hello")); // 比 m.insert({1, "Hello"}) 更早的写法 ``` 2. **返回多个值**: ```cpp std::pair<int, std::string> get_data() { return std::make_pair(200, "Success"); } ``` 3. **C++11 类型推导优化**: ```cpp auto p = std::make_pair(10, "Test"); // pair<int, const char*> ``` ### 类型推导细节 - 默认会**去除引用和 const 限定**: ```cpp int a = 10; const int& b = a; auto p = std::make_pair(b, a); // pair<int, int> 而非 pair<const int&, int&> ``` - 需要保持引用时使用 `std::ref`: ```cpp #include <functional> int x = 5; auto p = std::make_pair(std::ref(x), 10); // pair<int&, int> x = 6; // p.first 也会变为 6 ``` ### 与直接构造的对比 | 方式 | 代码长度 | 类型安全 | 可维护性 | |---------------------|----------|----------|----------| | `make_pair` | 短 | 自动推导 | 更优 | | 直接构造 `pair` | 长 | 显式控制 | 明确 | ### C++17 改进 在 C++17 中可以通过类模板参数推导(CTAD)实现类似效果: ```cpp std::pair p(5, "Hello"); // 自动推导为 pair<int, const char*> ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值