C++ pair 用法

2022年10月9日 244点热度 0人点赞 0条评论

pair 的应用

pair 是将 2 个数据组合成一组数据, 当需要这样的需求时就可以使用 pair, 如 stl 中的 map 就是将 keyvalue 放在一起来保存. 另一个应用是, 当一个函数需要返回 2 个数据的时候, 可以选择 pair. pair 的实现是一个结构体, 主要的两个成员变量是 firstsecond 因为是使用 struct 不是 class, 所以可以直接使用 pair 的成员变量.

其标准库类型, pair 类型, 定义在 #include <utility> 头文件中, 定义如下:

  • 类模板: template<class T1, class T2> struct pair
  • 参数: T1 是第一个值的数据类型,T2是第二个值的数据类型.
  • 功能: pair 将一对值 (T1T2) 组合成一个值, 这一对值可以具有不同的数据类型, 两个值可以分别用 pair 的两个公有函数 firstsecond 访问.

定义 (构造函数):

pair<T1, T2> p1;            // 创建一个空的 pair 对象 (使用默认构造), 它的两个元素分别是 T1 和 T2 类型, 采用值初始化.
pair<T1, T2> p1(v1, v2);    // 创建一个 pair 对象, 它的两个元素分别是 T1 和 T2 类型, 其中 first 成员初始化为 v1, second 成员初始化为 v2.
make_pair(v1, v2);          // 以 v1 和 v2 的值创建一个新的 pair 对象, 其元素类型分别是 v1 和 v2 的类型.
p1 < p2;                    // 两个 pair 对象间的小于运算, 其定义遵循字典次序: 如 p1.first < p2.first 或者 ! (p2.first < p1.first) && (p1.second < p2.second) 则返回 true.
p1 == p2;                   // 如果两个对象的 first 和 second 依次相等, 则这两个对象相等; 该运算使用元素的==操作符.
p1.first;                   // 返回对象 p1 中名为 first 的公有数据成员
p1.second;                  // 返回对象 p1 中名为 second 的公有数据成员

pair 的创建和初始化

pair 包含两个数值, 与容器一样, pair 也是一种模板类型. 但是又与之前介绍的容器不同; 在创建 pair 对象时, 必须提供两个类型名, 两个对应的类型名的类型不必相同.

pair<string, string> anon;        // 创建一个空对象 anon, 两个元素类型都是 string
pair<string, int> word_count;     // 创建一个空对象 word_count, 两个元素类型分别是 string 和 int 类型
pair<string, vector<int> > line;  // 创建一个空对象 line, 两个元素类型分别是 string 和 vector 类型

当然也可以在定义时进行成员初始化:

pair<string, string> author("James","Joy");    // 创建一个 author 对象, 两个元素类型分别为 string 类型, 并默认初始值为 James 和 Joy.
pair<string, int> name_age("Tom", 18);
pair<string, int> name_age2(name_age);         // 拷贝构造初始化

pair 类型的使用相当的繁琐, 如果定义多个相同的 pair 类型对象, 可以使用 typedef 简化声明:

typedef pair<string, string> Author;
Author proust("March","Proust");
Author Joy("James","Joy");

变量间赋值:

pair<int, double> p1(1, 1.2);
pair<int, double> p2 = p1;     // copy construction to initialize object
pair<int, double> p3;
p3 = p1;                       // operator =

pair 对象的操作

访问两个元素操作可以通过 first 和 second 访问:

pair<int , double> p1;
p1.first = 1;
p1.second = 2.5;
cout << p1.first << ' ' << p1.second << endl;

// 输出结果: 1 2.5
string firstBook;
if(author.first == "James" && author.second == "Joy")
    firstBook="Stephen Hero";

生成新的 pair 对象

还可以利用 make_pair 创建新的 pair 对象:

pair<int, double> p1;
p1 = make_pair(1, 1.2);

cout << p1.first << p1.second << endl;

//output: 1 1.2

int a = 8;

string m = "James";

pair<int, string> newone;

newone = make_pair(a, m);
cout << newone.first << newone.second << endl;

// output: 8 James

通过 tie 获取 pair 元素值

在某些清况函数会以 pair 对象作为返回值时, 可以直接通过 std::tie 进行接收. 比如:

std::pair<std::string, int> getPreson() {
    return std::make_pair("Sven", 25);
}

int main(int argc, char **argv) {
    std::string name;
    int ages;
    std::tie(name, ages) = getPreson();
    std::cout << "name: " << name << ", ages: " << ages << std::endl;
    return 0;
}

版权声明: 本文为 CSDN 博主「sevencheng798」的原创文章, 遵循 CC 4.0 BY-SA 版权协议, 转载请附上原文出处链接及本声明.
原文链接:https://blog.csdn.net/sevenjoin/article/details/81937695

file

rainbow

没什么大用的码农; 贴图怪; bug制造者; 只会电脑开关机的开发;

文章评论