【C++入門】tupleとpairを使って関数から複数の値を返す方法
はじめに
C言語やC++では、関数は原則として1つの値しか返すことができません。複数の値を返したい場合、従来はポインタや参照を使った「出力パラメータ」(引数経由で結果を受け渡す方法)を利用する必要がありました。
しかしC++では、STLが提供する std::tuple と std::pair を活用することで、出力パラメータに頼らずに関数から複数の値を直接返すことができます。本記事では、その具体的な方法をサンプルコードとともにわかりやすく解説します。
tuple(タプル)とは
std::tuple は、複数の要素をまとめて保持できるオブジェクトです。最大の特徴は、各要素にそれぞれ異なる型を指定できる点です。たとえば「int型・string型・char型」のように、型の異なる複数の値をひとつの戻り値として扱うことができます。
pair(ペア)とは
std::pair は、2つの値を組み合わせて保持できるシンプルな構造です。こちらも2つの値の型は異なっていても問題ありません。実は pair は tuple の特殊な形であり、「要素がちょうど2つに限定されたタプル」と考えることができます。
サンプルコード
以下の例では、tuple を返す関数と pair を返す関数をそれぞれ定義し、呼び出し側でその値を受け取っています。
#include<iostream>
#include<tuple>
#include<utility>
using namespace std;
// 3つの値を持つtupleを返す関数
tuple<int, string, char> my_function_tuple(int x, string y) {
return make_tuple(x, y, 'A'); // 値からtupleを生成して返す
}
// 2つの値を持つpairを返す関数
std::pair<int, string> my_function_pair(int x, string y) {
return std::make_pair(x, y); // 値からpairを生成して返す
}
main() {
int a;
string b;
char c;
tie(a, b, c) = my_function_tuple(48, "Hello"); // tupleを展開して受け取る
pair<int, string> my_pair = my_function_pair(89, "World"); // 関数からpairを受け取る
cout << "Values in tuple: ";
cout << "(" << a << ", " << b << ", " << c << ")" << endl;
cout << "Values in Pair: ";
cout << "(" << my_pair.first << ", " << my_pair.second << ")" << endl;
}
実行結果
Values in tuple: (48, Hello, A) Values in Pair: (89, World)
コードのポイント
- make_tuple / make_pair:渡した値から tuple や pair を簡単に生成できるヘルパー関数です。テンプレート引数を明示的に書く必要がなく、型推論によって自動的に決まります。
- tie:関数が返した tuple を既存の変数へ展開(アンパック)するための関数です。これにより、戻り値の各要素を個別の変数として扱えます。
- first / second:pair の1つ目・2つ目の要素には、それぞれ
.firstと.secondというメンバでアクセスします。
C++17以降なら構造化束縛がさらに便利
C++17以降では、構造化束縛(structured bindings)を使うことで、tie を使わずともより直感的に複数の戻り値を受け取れます。
auto [a, b, c] = my_function_tuple(48, "Hello"); // 変数宣言と受け取りを同時に auto [x, y] = my_function_pair(89, "World");
この書き方なら、事前に変数を宣言する必要がなく、コードが格段に簡潔になります。新しいプロジェクトでは積極的に活用するとよいでしょう。
まとめ
C++では std::tuple と std::pair を使うことで、関数から複数の値をスマートに返すことができます。要素数が2つだけなら pair、それ以上の場合は tuple を選ぶのが基本です。また、C++17以降の環境では構造化束縛と組み合わせることで、さらに読みやすく保守しやすいコードを実現できます。
-
C++で%演算子を使わずに3と5の倍数を判定する方法
通常、ある数が3や5の倍数であるかどうかを調べるには、% 演算子(剰余演算子)を使えば簡単に実装できます。しかし、この問題では % 演算子を使用することが禁止されています。そこで本記事では、+ 演算子(加算)を活用するアプローチを紹介します。考え方はシンプルで、「前の倍数に3または5を足せば次の倍数になる」という性質を利用します。まずは具体例を見てみましょう。入力例と出力例入力15出力1 2 3 - Multiple of 3 4 5 - Multiple of 5 6 - Multiple of 3 7 8 9 - Multiple of 3 10 - Multiple of 5 11 12
-
C++とOpenCVで画像を読み込んで表示する方法を徹底解説
この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name