EVERYTHING HAPPENS FOR TH|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-07-19 14:09阅读: 215评论: 0推荐: 0

元组:pair 与 tuple

众所周知,代码简短不一定易懂,但 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);i0 开始
  • 可以直接修改。
  • 支持大括号赋值,也可以 a = make_tuple(x, y, z, w)
  • a.size(),返回多元组大小,这里是 4

特殊使用

同 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 都不能用!

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

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/tuple.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(215)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
Paradise - NiziU
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : AKIRA/Bang Chan (3RACHA)/CHANGBIN (3RACHA)/HAN (3RACHA)

作曲 : Bang Chan (3RACHA)/CHANGBIN (3RACHA)/HAN (3RACHA)/VERSACHOI

编曲 : VERSACHOI/Bang Chan(3RACHA)

昔々きいた話

ふたつの虹を超えたその向こう

光り輝く泉がある

その水面(みなも)映るのは

ほんとの自分

しあわせは今 しあわせは空

Let’s fly fly & fly We fly & fly

目と目を合わせ

信じあえるよ 感じあえるさ

Let’s fly fly & fly We fly & fly

いつか

わかるだろう

君にはもう君だけの色も形も

優しさも強さもあるんだ

上手くいかなくたって

失敗ばっかりだって

ぼくはここにいるよ

I love you so much 大好きなんだ

そのままで 大好きさ Paradise

宝物はそこにあるよ 気がついてよ

世界中探しても

君は君しかいないよ

広がる楽園 繋げよう

誰も誰もが Paradise

雨が降れば ぬかるむ道 Oh yeah

道端に咲いた花に集まる蝶を

照らす太陽は全てを温め

乾いた道に雨は降る

あたりまえだけど奇跡

小さなちっぽけな今には

大きな大きな夢が詰まっているの

悔しさに泣いたって

手を差し伸べるから

ぼくはここにいるから

I love you so much 大好きなんだ

そのままで 大好きさ Paradise

宝物は君なんだよ 気がついてよ

この惑星(ほし)の歴史にも

君は君しかいないよ

目に見えないけど確かに

ひとりひとりの Paradise

しあわせは今 しあわせは空

Let’s fly fly & fly We fly & fly

目と目を合わせ

信じあえるよ 感じあえる

だから大丈夫

心のまま行こう Paradise

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示