本文へスキップ
BecomeCoder

C++コース · 第14章 STLコンテナ ― 標準の入れ物を使いこなす · レッスン56

pair と tuple ― 値を組にする

ブラウザで完結

導入

「名前と年齢」「x と y」のように、複数の値をひとまとめにして返したり持ち歩いたりしたい――そのたびに struct を作らずに済む軽量な組が std::pair(2つ)と std::tuple(3つ以上)です。STL の各所で使われます。

説明

std::pair<A, B> は2つの値の組です。.first .second で取り出します。作るときは make_pair{} が使えます。

#include <iostream>
#include <string>
#include <utility>   // pair
using namespace std;

pair<string, int> makeUser() {
    return { "たろう", 20 };   // 2つの値をまとめて返す
}

int main() {
    pair<string, int> u = makeUser();
    cout << u.first << " / " << u.second << endl;   // たろう / 20

    auto p = make_pair(3, 4);   // auto で受けると楽
    cout << p.first + p.second << endl;   // 7
    return 0;
}

3つ以上の値は std::tuple です。取り出しは std::get<番号>(t)、または「構造化束縛」(第17章)で一気に分解できます。

flowchart LR
  t["tuple&lt;string, int, double&gt;"]
  t --> a["get&lt;0&gt; → 名前"]
  t --> b["get&lt;1&gt; → 年齢"]
  t --> c["get&lt;2&gt; → 身長"]
#include <iostream>
#include <string>
#include <tuple>
using namespace std;

int main() {
    tuple<string, int, double> t = { "はな", 25, 160.5 };
    cout << get<0>(t) << endl;   // はな
    cout << get<1>(t) << endl;   // 25
    cout << get<2>(t) << endl;   // 160.5
    return 0;
}

まとめ

pair は2つ、tuple は3つ以上の値の組です。「関数から複数の値を返したい」ときに手軽です。取り出しは pair.first/.secondtupleget<番号>。分解には構造化束縛(第17章)が便利です。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。