pair类模板

键值对数据类型

关联式容器存储的是”键值对“形式的数据,如:

<"a","121">
<"b","144">
<"c","156">

以上每行都表示一个键值对,其中第一个元素作为键,第二个元素作为值,由于键值对不是普通数据类型,c++STL标准库提供了pair类模板,用于将两个普通元素a和b,创建成一个新元素<a,b>

pair对象构造

pair类模板定义在< utility >头文件中,所以在使用该类模板之前,需要引入该头文件,且pair类模板提供了共五种构造函数,如下:

  • 默认构造函数,即创建空的 pair 对象:pair();
  • 直接使用 2 个元素初始化成 pair 对象:pair (const first_type& a, const second_type& b);
  • 拷贝(复制)构造函数,即借助另一个 pair 对象,创建新的 pair 对象:template<class U, class V> pair (const pair<U,V>& pr);
  • 移动构造函数:template<class U, class V> pair (pair<U,V>&& pr);
  • 使用右值引用参数,创建 pair 对象:template<class U, class V> pair (U&& a, V&& b);

关于右值引用

注:对于右值引用,能出现在赋值号左边的表达式称为“左值”,不能出现在赋值号左边的表达式为“右值”,一般来说,左值可以取地址,右值不可以。非const变量都是左值,函数调用的返回值若不是引用,则该函数调用就是右值,在不专门指出时,引用基本都是引用变量的,即左值引用。c++11中新增了一种右值引用,可以引用无名的临时变量,使用符号为“&&”

引入右值引用的主要目的是提高程序运行的效率。有些对象是无名临时变量,但在复制时却需要进行深复制,往往非常耗时。合理使用右值引用可以避免没有必要的深复制操作

赋值和比较

pair对象是允许手动赋值的,可用.first和.second分别访问pair对象的键和值,同样,也可以使用make_pair()函数,向其中传入两个参数代表对象的键和值

< utility >头文件中,除了提供创建pair对象的方法之外,还为pair对象重载了以下6种运算符:<、<=、>、>=、==、!=,其运算规则是先比较键的大小,如果键的大小相等,再比较值的大小,且对于比较的两个pair对象,其对应的键和值的类型应该相同,否则编译器将找不到合适的重载运算符

除此之外,当键和值的类型都相同时,可以使用swap()成员函数交换两个pair对象的的键值对,同其他容器中的swap()效果相同

代码实例

#include <iostream>
#include <utility> // pair
#include <string> // string
using namespace std;
int main() {
// 调用构造函数 1,也就是默认构造函数
pair <string, double> pair1;
// 调用第 2 种构造函数
pair <string, string> pair2("1","9");
// 调用拷贝构造函数
pair <string, string> pair3(pair2);
//调用移动构造函数
pair <string, string> pair4(make_pair("2", "8"));
// 调用第 5 种构造函数
pair <string, string> pair5(string("3"), string("7"));

cout << "pair1: " << pair1.first << " " << pair1.second << endl;
cout << "pair2: "<< pair2.first << " " << pair2.second << endl;
cout << "pair3: " << pair3.first << " " << pair3.second << endl;
cout << "pair4: " << pair4.first << " " << pair4.second << endl;
cout << "pair5: " << pair5.first << " " << pair5.second << endl;
return 0;
}

输出结果为:

pair1: 0
pair2: 1 9
pair3: 1 9
pair4: 2 8
pair5: 3 7



#include <iostream>
#include <utility> // pair
#include <string> // string
using namespace std;
int main() {
pair <string, int> pair1("1", 20);
pair <string, int> pair2("2", 20);
pair <string, int> pair3("2", 30);
//pair1和pair2的key不同,value相同
if (pair1 != pair2) {
cout << "pair != pair2" << endl;
}
//pair2和pair3的key相同,value不同
if (pair2 != pair3) {
cout << "pair2 != pair3" << endl;
}
return 0;
}

输出结果为:

pair != pair2
pair2 != pair3



#include <iostream>
#include <utility> // pair
#include <string> // string
using namespace std;
int main() {
pair <string, int> pair1("pair", 10);
pair <string, int> pair2("pair2", 20);
//交换 pair1 和 pair2 的键值对
pair1.swap(pair2);
cout << "pair1: " << pair1.first << " " << pair1.second << endl;
cout << "pair2: " << pair2.first << " " << pair2.second << endl;
return 0;
}

输出结果为:

pair1: pair2 20
pair2: pair 10