C++容器 pair

介绍 

        std::pair是一个类模板,它提供了一种将两个异构对象存储为一个单元的方法。pair由< 键 , 值 >构成的“键值对”数据类型,每行都表示一个键值对,其中第一个元素作为键(key),第二个元素作为值(value),例如:

<"C++", "C++ Primer Plus">
<"Python", "Python机器学习及实践">
<"Java", "Java语言程序设计">


 初始化pair类型对象

        pair在头文件utility中定义 ,所以使用时,我们需要包含头文件:

#include <utility>

        考虑到“键值对”并不是普通类型数据,C++标准库提供了 pair 类模板,其专门用来将 2 个普通元素 first 和 second(可以是 C++ 基本数据类型、结构体、类自定的类型)创建成一个新元素<first, second>。

// 调用默认构造函数初始化
std::pair<string, double> pair1;

// 使用给定值初始化
std::pair<string, string> pair2("张三","计算机工程学院");

// 调用拷贝构造函数
std::pair<string, string> pair3(pair2);


元素访问和赋值

        pair提供了first和second两个公有成员,用于访问pair的两个数据成员。

std::pair<char*,double> teacher("李四", 30);
p2.first = "王二";
p2.second = 34;
std::cout << p2.first << "\t" << p2.second << std::endl;     //输出结果 :王二 34

         两个pair对象,如果他们的first和second成员类型相同,就可以相互赋值;此外,可以用make_pair模板函数创建pair对象,然后把他赋值给pair对象。

std::pair<string,double> s1,s2;
s1 = std::make_pair("李四", 30);                       // 创建pair对象再赋值
s2 = s1;                                               // 同类型pair对象直接赋值

        pair类型也可以定义成数组类型:

std::pair<int,int> match[20];

        pair类型通常用来构造其他容器中的元素,如map中的映射值对,或者vector、list、set中的元素,也常用于函数的返回类型,可以一次返回一个值对,使得函数设计更为简洁。 


pair大小比较

        utility头文件中除了提供创建 pair 对象的方法之外,还为 pair 对象重载了 <、<=、>、>=、==、!= 这 6 的运算符,其运算规则是:对于进行比较的 2 个 pair 对象,先比较 pair.first 元素的大小,如果相等则继续比较 pair.second 元素的大小。

注意:
对于进行比较的 2 个 pair 对象,其对应的键和值的类型比较相同,否则将没有可比性,
同时编译器提示没有相匹配的运算符,即找不到合适的重载运算符。
std::pair<string, int> pair1("张三", 20);
std::pair<string, int> pair2("李四", 20);
std::pair<string, int> pair3("李四", 30);

// pair1和pair2的key不同,value相同,先比较key大小,输出 pair > pair2
if (pair1 > pair2) {
    std::cout << "pair > pair2" << std::endl;
}
else {
    std::cout << "pair < pair2" << std::endl;
}

//pair2和pair3的key相同,value不同,比较value大小,输出 pair2 < pair3
if (pair2 > pair3) {
    std::cout << "pair2 > pair3" << std::endl;
}
else {
    std::cout << "pair2 < pair3" << std::endl;
}


pair的成员函数

  • swap():pair类模板提供一个 swap() 成员函数,能够互换 2 个 pair 对象的键值对,其操作成功的前提是这 2 个 pair 对象的键和值的类型要相同:
std::pair<string, int> pair1("pair1", 10);                   
std::pair<string, int> pair2("pair2", 20);

// 交换 pair1 和 pair2 的键值对
pair1.swap(pair2);
std::cout << "pair1: " << pair1.first << " " << pair1.second << std::endl;
std::cout << "pair2: " << pair2.first << " " << pair2.second << std::endl;

// 输出:
// pair1: pair2 20
// pair2: pair1 10


辅助类

std::tuple_size:计算元组的元素个数,pair因为只有两个元素,所以结果一定是2:

std::pair<int, int> p = std::make_pair(2, 3);
int i_count = std::tuple_size<decltype(p)>::value;

std::cout << "pair size is " << i_count << std::endl;       // 输出:pair size is 2

std::tuple_element:获取元组中某个元素的数据类型,【尖括号中的第一个参数】- 元组中元素的索引,【尖括号中的第二个元素】- 哪一个元组

std::pair<int, std::string> p = std::make_pair(1, std::string{ "one" });
std::tuple_element<0, decltype(p)>::type first = std::get<0>(p);
std::tuple_element<1, decltype(p)>::type second = std::get<1>(p);

std::cout << first << " " << second << std::endl;           // 输出:1 one

<think>好的,我需要帮助用户找到C++pair相关的头文件。首先,用户的问题是关于C++pair类的头文件是什么。根据我的知识库,C++中的pair确实属于标准库的一部分,通常包含在<utility>头文件中。不过,我得确认是否有其他可能的头文件也可能包含pair的定义。 查看提供的引用内容,引用[1]提到pair位于<utility>头文件中,并定义在std命名空间里。引用[2]也确认了这一点,并讨论了是否必须包含该头文件。引用[3]和[4]进一步详细说明了pair的结构和使用方法,但同样没有提到其他头文件。因此,可以确定用户需要包含<utility>来使用pair。 可能用户在使用pair时遇到编译错误,比如“未声明的标识符”,这可能是因为没有包含正确的头文件或者忘记使用std命名空间。此外,用户可能想知道是否可以不包含<utility>,但根据引用[2],虽然某些情况下可能间接包含,但显式包含更为可靠。 因此,回答应明确指出头文件是<utility>,并建议包含该头文件以确保可移植性。同时,可能需要提到std命名空间的使用,以及常见的初始化方法如make_pair。另外,引用相关的资料来支持回答的正确性,例如引用[1]和[2]。 需要生成相关问题,比如pair的初始化方法、使用场景,或者与其他结构的比较。确保问题与用户可能进一步的需求相关,帮助他们深入理解pair的使用。</think>C++中`pair`类的头文件是`<utility>`,使用时需要包含该头文件并位于`std`命名空间中[^1][^2]。例如: ```cpp #include <utility> std::pair<int, std::string> p = std::make_pair(42, "hello"); ``` **关键点说明:** 1. **必须包含的头文件**:`<utility>`是`pair`模板类的官方定义位置 2. **命名空间限定**:所有标准库组件都在`std`命名空间中,需使用`std::pair`或通过`using namespace std`声明 3. **常用初始化方式**: - 直接构造:`std::pair<int, double>(1, 3.14)` - 使用`make_pair`:`auto p = std::make_pair(1, 3.14)` **注意事项**: - 某些编译器可能在包含其他头文件(如`<algorithm>`或`<map>`)时隐式包含`<utility>`,但显式包含更可靠[^2] - C++11起支持列表初始化:`std::pair<int, std::string>{1, "one"}`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值