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

猜你喜欢

转载自blog.csdn.net/Sakuya__/article/details/122710518