コンテンツにスキップ

C++/標準ライブラリ/tuple

出典: フリー教科書『ウィキブックス(Wikibooks)』

タプルの概要[編集]

タプルとは[編集]

タプルは、異なる型の複数の要素をまとめて1つのオブジェクトとして扱うためのC++標準ライブラリのコンテナです。これにより、関連するデータをまとめて扱うことができます。

タプルの特徴と利点[編集]

  • タプルはサイズが固定されているため、メモリ使用量が少なくなります。
  • タプルは異なる型の要素を保持できるため、柔軟性が高くなります。
#include <tuple>
#include <iostream>

auto main() -> int {
    // タプルの定義と初期化
    std::tuple<int, double, std::string> myTuple(10, 3.14, "Hello");
    
    // タプル要素へのアクセス
    std::cout << "Element 1: " << std::get<0>(myTuple) << std::endl;
    std::cout << "Element 2: " << std::get<1>(myTuple) << std::endl;
    std::cout << "Element 3: " << std::get<2>(myTuple) << std::endl;

    return 0;
}

タプルの定義と初期化[編集]

タプルの定義[編集]

タプルは std::tuple テンプレートを使用して定義されます。要素の型はテンプレート引数として指定します。

#include <tuple>

std::tuple<int, double, std::string> myTuple;

タプルの初期化[編集]

初期化リストを使用して、タプルの要素を初期化できます。

#include <tuple>

std::tuple<int, double, std::string> myTuple(10, 3.14, "Hello");

タプルの要素へのアクセス[編集]

タプル要素へのアクセス[編集]

std::get 関数を使用して、タプルの要素にアクセスします。要素のインデックスは0から始まります。

#include <tuple>
#include <iostream>

std::tuple<int, double, std::string> myTuple(10, 3.14, "Hello");
std::cout << "Element 1: " << std::get<0>(myTuple) << std::endl;
std::cout << "Element 2: " << std::get<1>(myTuple) << std::endl;
std::cout << "Element 3: " << std::get<2>(myTuple) << std::endl;

構造化束縛を使ったタプルの要素へのアクセス[編集]

C++17以降では、構造化束縛を使ってタプルの要素に直接名前を付けることができます。

#include <tuple>
#include <iostream>

std::tuple<int, double, std::string> myTuple(10, 3.14, "Hello");
auto [num, pi, greeting] = myTuple;
std::cout << "Number: " << num << std::endl;
std::cout << "Pi: " << pi << std::endl;
std::cout << "Greeting: " << greeting << std::endl;

タプルの操作[編集]

タプルの結合と分解[編集]

std::tuple_cat 関数を使用して、複数のタプルを結合できます。また、構造化束縛を使ってタプルを分解することもできます。

#include <tuple>
#include <iostream>

std::tuple<int, double> tuple1(10, 3.14);
std::tuple<std::string, char> tuple2("Hello", 'A');

auto combinedTuple = std::tuple_cat(tuple1, tuple2);
auto [num, pi, greeting, letter] = combinedTuple;

std::cout << "Number: " << num << std::endl;
std::cout << "Pi: " << pi << std::endl;
std::cout << "Greeting: " << greeting << std::endl;
std::cout << "Letter: " << letter << std::endl;

タプルの要素の変更[編集]

タプルの要素は不変ですが、新しいタプルを作成して要素を変更することができます。

#include <tuple>

std::tuple<int, double, std::string> myTuple(10, 3.14, "Hello");
auto modifiedTuple = std::make_tuple(std::get<0>(myTuple), 6.28, std::get<2>(myTuple));

タプルの比較[編集]

タプルの比較[編集]

タプル同士の比較は、要素ごとの比較演算子 (==, !=, <, <=, >, >=) を使用して行われます。

#include <tuple>

std::tuple<int, double> tuple1(10, 3.14);
std::tuple<int, double> tuple2(5, 2.71);

if (tuple1 < tuple2) {
    std::cout << "tuple1 is less than tuple2" << std::endl;
} else {
    std::cout << "tuple1 is greater than or equal to tuple2" << std::endl;
}

タプルの利用事例[編集]

タプルの実用的な使用例[編集]

タプルは、関数の多値返しや、異なる型のデータを1つのオブジェクトとして扱う場合に便利です。

#include <tuple>
#include <iostream>

std::tuple<int, double, std::string> getData() {
    return std::make_tuple(
:<syntaxhighlight lang=c++>
        42, 3.14, "Hello"
    );
}

auto main() -> int {
    auto data = getData();
    std::cout << "Number: " << std::get<0>(data) << std::endl;
    std::cout << "Pi: " << std::get<1>(data) << std::endl;
    std::cout << "Greeting: " << std::get<2>(data) << std::endl;

    return 0;
}

このように、タプルを使用することで、1つの関数から複数の異なる型の値を返すことができます。また、std::tieを使用することで、関数から返されたタプルの要素を簡単に変数に分解することもできます。

#include <tuple>
#include <iostream>

std::tuple<int, double, std::string> getData() {
    return std::make_tuple(42, 3.14, "Hello");
}

auto main() -> int {
    int num;
    double pi;
    std::string greeting;

    std::tie(num, pi, greeting) = getData();

    std::cout << "Number: " << num << std::endl;
    std::cout << "Pi: " << pi << std::endl;
    std::cout << "Greeting: " << greeting << std::endl;

    return 0;
}

これらの例は、タプルがどのようにして柔軟性の高いプログラミングを可能にするかを示しています。

章末問題[編集]

理解度チェック[編集]

基本問題
タプルから特定の要素を取り出し、それらの値を出力するプログラムを作成してください。
応用問題
2つのタプルを結合し、新しいタプルを作成してください。
プログラム作成問題
タプルを使用して、簡単なデータベースエントリーを表現するプログラムを作成してください。

用語集[編集]

以下は、タプルに関連する用語の簡単な説明です。

タプル (Tuple)
異なる型の要素を順序付けて保持するコンテナ。C++では、std::tupleを使用して宣言される。
要素 (Element)
タプル内の1つの値。各要素は、タプル内で固有の位置を持つ。
要素の型 (Element Type)
タプル内の個々の要素のデータ型。
インデックス (Index)
タプル内の要素の位置を示す番号。0から始まる整数値で、各要素は固有のインデックスを持つ。
タプルのサイズ (Tuple Size)
タプル内の要素の数。std::tuple_sizeテンプレートを使用して取得できる。
タプルの要素の取得 (Accessing Tuple Elements)
インデックスを使用して、タプル内の特定の要素にアクセスする操作。
タプルの結合と分解 (Tuple Concatenation and Decomposition)
複数のタプルを結合して1つのタプルを作成する操作。また、1つのタプルを複数の変数に分解する操作。
タプルの比較 (Tuple Comparison)
タプル同士の要素を比較し、その結果に基づいてタプルを順序付ける操作。
構造化束縛 (Structured Binding)
C++17以降で導入された機能で、タプルや他のデータ構造から要素を取り出して個々の変数に束縛する方法。