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() { pair <string, double> pair1; pair <string, string> pair2("1","9"); pair <string, string> pair3(pair2); pair <string, string> pair4(make_pair("2", "8")); 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); if (pair1 != pair2) { cout << "pair != pair2" << endl; } 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.swap(pair2); cout << "pair1: " << pair1.first << " " << pair1.second << endl; cout << "pair2: " << pair2.first << " " << pair2.second << endl; return 0; }
|
输出结果为:
pair1: pair2 20
pair2: pair 10