C++の構造化束縛とかいう神機能

C++

この機能は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;
    }
}

最後に

知ってるだけで、楽に読みやすいコードが書けると思うのでぜひみなさんも使ってみてください!!

コメント

タイトルとURLをコピーしました