C++ | C++ STL pair用法详解

C++ | C++ STL pair用法详解

<"c" , "c language">
<"java" , "Java language">
<"python" , "Python language">

如上所示,每行都表示一个键值对,其中第一个元素作为key),第二个元素作为value)。

注意:基于各个关联式容器存储数据的特点,只有各个键值对中的键和值全部对应相等时,才能使用 setmultiset 关联式容器存储,否则就要选用 map 或者 multimap 关联式容器。

std::pair

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

std::pair<T1,T2>::pair

在 C++ 11 标准之前,pair 类模板中提供了以下 3 种构造函数:

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

在 C++ 11 标准中,在引入右值引用的基础上,pair 类模板中又增添了如下 2 个构造函数:

//4) 移动构造函数
template<class U, class V> pair (pair<U,V>&& pr);
//5) 使用右值引用参数,创建 pair 对象
template<class U, class V> pair (U&& a, V&& b);

template< class... Args1, class... Args2 >
pair( std::piecewise_construct_t,
      std::tuple<Args1...> first_args,
      std::tuple<Args2...> second_args );

实例1

/*******************************************************************
 *   > File Name: stl-pair.cpp
 *   > Create Time: 2021年10月 8日 23:38:07
 ******************************************************************/
#include <iostream>
#include <utility>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
    pair<string, double> pair1; /* 使用默认构造函数 */
    pair<string, string> pair2("C", "C Language Study"); /* 调用第2中构造函数 */
    pair<string, string> pair3(pair2); /*调用拷贝构造函数*/
    pair<string, string> pair4(make_pair("C++", "C++ Language Study")); /* 调用移动构造函数 */
    pair<string, string> pair5(string("Python"), string("Python Language Study")); /*第5种构造函数*/

    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;
}

编译、运行:

g++ -o stl-pair stl-pair.cpp -g -Wall -std=c++11
PS D:\study\cplusplus\day14> .\stl-pair.exe
pair1:  , 0
pair2: C , C Language Study
pair3: C , C Language Study
pair4: C++ , C++ Language Study
pair5: Python , Python Language Study

上面程序在创建 pair4 对象时,调用了 make_pair() 函数,它也是 头文件提供的,其功能是生成一个 pair 对象。

因此,当我们将 make_pair() 函数的返回值(是一个临时对象)作为参数传递给 pair() 构造函数时,其调用的是移动构造函数,而不是拷贝构造函数。

实例2

/*******************************************************************
 *   > File Name: stl-pair1.cpp
 *   > Create Time: 2021年10月 8日 23:49:01
 ******************************************************************/
#include <iostream>
#include <utility>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
    pair<string, double> pair1;
    pair1.first = "TEST"; /*为pair1对象赋值*/
    pair1.second = 99.9; /*为pair1对象赋值*/
    cout << "pair1: " << pair1.first << " , " << pair1.second << endl;
    return 0;
}

编译、运行:

g++ -o stl-pair1 stl-pair1.cpp -g -Wall -std=c++11
PS D:\study\cplusplus\day14> .\stl-pair1.exe
pair1: TEST , 99.9

实例3

pair4 对象的创建过程,还可以写成如下形式:

pair <string, string> pair4 = make_pair("C++", "C++ Language Study");
cout << "pair4: " << pair4.first << " " << pair4.second << endl;

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

注意:对于进行比较的 2 个 pair 对象,其对应的类型比较相同,否则将没有可比性,同时编译器提示没有相匹配的运算符,即找不到合适的重载运算符。

实例4(比较pair对象)

/*******************************************************************
 *   > File Name: stl-pair2.cpp
 *   > Create Time: 2021年10月 9日 16:10:41
 ******************************************************************/
#include <iostream>
#include <utility>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
    pair<string, int> pair1("STL", 20);
    pair<string, int> pair2("C++", 20);
    pair<string, int> pair3("C++", 40);

    if(pair1 != pair2){ /*key不同,value相同*/
        cout << "pair1 != pair2" << endl;
    }

    if(pair2 != pair3){/*key相同,value不同*/
        cout << "pair2 != pair3" << endl;
    }

    return 0;
}

编译、运行:

PS D:\study\cplusplus\day14> make stl-pair2
g++ -o stl-pair2 stl-pair2.cpp -g -Wall -std=c++11
PS D:\study\cplusplus\day14> .\stl-pair2.exe
pair1 != pair2
pair2 != pair3

pair类模板还提供有一个 swap() 成员函数,能够互换 2 个 pair 对象的键值对,其操作成功的前提是这 2 个 pair 对象的的类型要相同。

实例5(swap()函数)

/*******************************************************************
 *   > File Name: stl-pair3.cpp
 *   > Create Time: 2021年10月 9日 17:52:27
 ******************************************************************/
#include <iostream>
#include <utility>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
    pair<string, int> pair1("pair1", 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;
}

编译、运行:

PS D:\study\cplusplus\day14> make stl-pair3
g++ -o stl-pair3 stl-pair3.cpp -g -Wall -std=c++11
PS D:\study\cplusplus\day14> .\stl-pair3.exe
pair1: pair2 20
pair2: pair1 10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值