首页 > 其他分享 >元组:pair 与 tuple

元组:pair 与 tuple

时间:2023-07-19 14:24:35浏览次数:33  
标签:定义 get auto tuple 元组 pair 多元

众所周知,代码简短不一定易懂,但 pair 和 tuple 也确实是十分方便的多元组,适当使用可以使代码变简短。

前置:结构体

应该是最简洁明了的多元组吧。

当你需要将一些数据捆绑在一起时, 你可以使用结构体。

struct Node {
  int a, b;
  string c;
} a;

cout << a.a << ' ' << a.b << ' ' << a.c;

结构体的排序规则需要自定义,但这也不失为它的一个优点:灵活。

struct Node {
  int a, b;
  string c;
  bool operator < (const Node &i) const {
    return (a != i.a ? a < i.a : b > i.b);
  }
} a[10];

sort(a, a + 10);

二元组:pair

定义方式

定义一个二元组:pair<第一元类型, 第二元类型> 二元组组名;

pair<int, int>
pair<string, double>
pair<vector<int>, vector<string>>
pair<pair<int, double>, pair<pair<int, int>, vector<string>>>

当然也可以……

struct Node {
  int a, b, c, x, y, z;
  string name;
  vector<int> g;
};

pair<int, Node>

基本使用

假设定义了一个 pair<int, int> a

  • 调用:第一元a.first,第二元a.second
  • 可以直接修改。
  • 支持大括号赋值:a = {10, 15}

特殊使用

排序时,可以不用自定义规则,默认按第一元从小到大,当第一元相等时第二元从小到大。

多元组:tuple

pair 仅仅只是二元组,当你要实现多元时它就显得没那么方便了(当然可以 pair 套 pair),为了方便与美观,就需要多元组:tuple。

虽然是多元组,但它比起 pair 也有些不足之处,比如说头文件方面……

定义方式

注意,需要头文件:#include <tuple>

定义一个 \(n\) 元组:tuple<第一元类型, 第二元类型, 第三元类型 ... 第 n 元类型> n 元组组名;

就不举例了。

基本使用

假设定义了一个四元组 tuple<int, string, double, long long> a

  • 调用:访问第 \(i\) 个元素:get<i>(a);\(i\) 从 \(0\) 开始
  • 可以直接修改。
  • 不支持大括号赋值,需要:a = make_tuple(x, y, z, w)

特殊使用

同 pair。

结构化绑定

C++17 特性,方便又快捷。

安照多元组中各个元的出现顺序,将各个元素的值复制到变量上,可以直接使用变量进行操作,无需使用多元组的访问方法。

格式

假设定义了一个四元组 tuple<int, string, double, long long> a

你现在想取出 a 中的每个元素,分别存储在四个变量 xyzw 中,格式为:auto [x, y, z, w] = a;

auto [x[1], x[2], x[3] ... x[n]] = n 元组,auto 自动匹配元素类型。

#include <iostream>
#include <tuple>

using namespace std;

tuple<int, int, int, int> a;

int main () {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> get<0>(a) >> get<1>(a) >> get<2>(a) >> get<3>(a);
  auto [x, y, z, w] = a;
  cout << x + y << ' ' << z + w << ' ' << x * y * z * w;
  return 0;
}

输入 1 3 5 7,输出 4 12 105

实际应用

我比较常用的地方:

  • Dij 取出 pq.top()(例:auto [now, lv] = pq.top()),或在边权不相等时遍历其他点(例:for(auto [i, x] : g[now]))。
  • 遍历各种 STL 容器(例:map<int, int> mp; for(auto [x, y] : mp))。

反正它就是一个偷懒神器!

再次强调,这是 C++17 及以上才有的特性!

所以不要乱用。

C++11 或 C++14 都不能用!

当你确定可用时可以美观代码,虽然不一定能减少行数,但绝对是能更加清晰明了!

标签:定义,get,auto,tuple,元组,pair,多元
From: https://www.cnblogs.com/lw0-blog/p/17563445.html

相关文章

  • Proj. CMI Paper Reading: Conversational Automated Program Repair
    Abstract背景:之前APR与大模型的结合仅仅使用了一些特殊构建的input/prompt本文:conversationalAPR方法:使用long-termcontextwindow来记录之前的validationfeedback实验:在10个LLMs上进行对比展示改进......
  • 字符串,列表的内置方法(增加、修改、删除) 、可变类型与不可变类型 、字典 ,元组,集合的
    字符串的内置方法(较多,重要)old_code='KeViN'print('这是返回给用户的验证码:%s'%old_code)new_code=input('请输入你的验证码:').strip()print(new_code)#对验证码作一个判断,现在对验证码作不区分带小写#ifold_code.upper()==new_code.upper():ifold_code.......
  • 字典,元组,元组内置方法、相关面试题 、 集合的内置方法 、字符编码 、文件操作 、函数
    字典的内置方法1.定义方式 d={'usernamne':"kevin"}#定义空字典d={}info=dict(username='kevin',age=18)#{'username':'kevin','age':18} print(info) #dic={#'name':�......
  • Python - list VS tuple, list() VS []
    差异一:list可变vstuple不可变列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。而元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。#Jupyter格式tup=(1,2,3,4)new_tup=tup+(5,)#创建新的元组new_tup,并依次填充原元组的值new_......
  • Python-()元组.py
     1#!/usr/bin/python 2#coding=UTF-8 3 4 5''' 6Python元组 7 8元组是另一个数据类型,类似于List(列表)。 9 10元组用()标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。 11''' 12 13 14tuple=('runoob',786,2.23,'......
  • LWC 50:677. Map Sum Pairs
    LWC50:677.MapSumPairs传送门:677.MapSumPairsProblem:ImplementaMapSumclasswithinsert,andsummethods.Forthemethodinsert,you’llbegivenapairof(string,integer).Thestringrepresentsthekeyandtheintegerrepresentsthevalue.Ifthekey......
  • Python 元组转换为列表
    1.直接将元组转为列表tup=(21,19,11,46,18)print(tup)lt=list(tup)print(lt)输出(21,19,11,46,18)[21,19,11,46,18]2.将元组列表转为列表#Listoftupleinitializationlistoftuples=[("Apple",1),("Microsoft",2),("Amazon",......
  • AtCoder Beginner Contest 308 G Minimum Xor Pair Query
    洛谷传送门AtCoder传送门考虑没有删除操作怎么做。可以动态维护\(ans\),新加进来一个\(x\),我们计算\(\min\limits_{y\inS}x\oplusy\)。对\(S\)建01Trie,然后从高位往低位按位贪心,在01Trie上优先往与\(x\)这一位相同的方向走,但是前提是它的子树内有数,对于01Trie......
  • [典·三元组]
    题目:MEX 来源:AtCoderBeginnerContest308根据例1可以先进行判断,如果根据E的不同情况进行统计的话方便入手1.从左到右统计M的{0,1,2}的情况2.从右到左统计X的{0,1,2}的情况3.判断当前s[i]为‘E’的情况下,并且对应的a[i]={0,1,2}三种情况相乘的个数(乘的是三元组的没出现的最......
  • CF1553F. Pairwise Modulo
    终于过了,感觉还是有点东西的。首先我们有一个很好想的\(O(n(\lnA+\sqrt{A})\logn)\)的做法。首先这个式子能写成\(p_i=\sum\limits_{j=1}^i\sum\limits_{k=1}^i\left(a_j-a_k\left\lfloor\dfrac{a_j}{a_k}\right\rfloor\right)\)的形式。前面求和那部分是简单的,我们主要去......