この機能はC++17以上で使えます
構造化束縛ってなんだ??
「構造化束縛 (structured bindings)」は、組やタプル、配列や構造体を分解して各要素を取り出す機能である。
C++日本語リファレンスより引用
だそうです…
つまり、このようにpairやtupleなどを書くことです
“変数名1” に “なにか1″ ”変数名2” に “なにか2″が入ります。
auto[変数名1, 変数名2] = 型名<型名1, 型名2>{なにか1, なにか2};
例(あんまりコレ単体で使うことはないと思いますが…)
auto [name, age] = pair<string, int>{"Suzuki", 10};
auto [name, age, money] = tuple<string, int, int>{"Yamada", 58, 100};
~じゃあどのような時に便利なの?~ 具体的な使い道
例えば、グラフアルゴリズムを使う場合などでは…
pair型で、firstにコスト、secondにノード番号を持つ場合…
今まで pair型などで受け取ったのちに 変数名.first などと書いていたものを意味のある変数名で受け取れるのです!!(コードの理解のしやすさが上がる⤴!!)
#include <bits/stdc++.h>
using namespace std;
using Pi = pair<int, int>;
int main() {
/*
//コスト : ノード番号のペアを管理する場合を考えてみる
*/
priority_queue<Pi> pq;
pq.push({0, 0});
pq.push({50, 1});
pq.push({100, 2});
while (!pq.empty()) {
/*具体的な名前で取り出せるため、意味を理解しやすくなる*/
auto [cost, node] = pq.top();
pq.pop();
cout << cost << " " << node << endl;
}
//今までの書き方(今思うと不便)
/*
while (!pq.empty()) {
auto p = pq.top();
pq.pop();
//p.first,p.secondが何を指してるのか、ぱっと見では不明
cout << p.first << " " << p.second << endl;
}
*/
}
tupleもいける
#include <bits/stdc++.h>
using namespace std;
int main() {
//名前、年齢、所持金を入れるタプルの配列
vector<tuple<string, int, int> > vec;
vec.push_back({"Suzuki", 30, 5000});
vec.push_back({"Tanaka", 20, 1000});
vec.push_back({"Yamada", 80, 3000});
//意味のある変数名で受け取れる!!
for (auto [name, age, money] : vec) {
cout << " name: " << name << " age: " << age << " money: " << money << endl;
}
}
mapもいける
#include <bits/stdc++.h>
using namespace std;
int main() {
map<string, int> mp;
mp["apple"] = 100;
mp["banana"] = 200;
mp["lemon"] = 300;
for (auto [fruit, price] : mp) {
cout << fruit << " " << price << endl;
}
}
最後に
知ってるだけで、楽に読みやすいコードが書けると思うのでぜひみなさんも使ってみてください!!
コメント