C++編【標準ライブラリ】 第3章 pair 解答ページ

先頭へ戻る

問題①

問題① 例えば 100 と "abc" という値のペアを管理する pair があるとき、標準出力へ "100, abc" という形式で出力する汎用的な関数を作成してください。


std::cout には、直接 pair を渡せません。ここでは関数化してみます。

#include <iostream>
#include <utility>
#include <string>

template <typename T1, typename T2>
void PrintPair(std::pair<T1, T2> p)
{
    std::cout << p.first << ", " << p.second << std::endl;
}

int main()
{
    std::pair<int, double> a(10, 3.5);
    std::pair<int, std::string> b(10, "abc");

    PrintPair(a);
    PrintPair(b);
}

実行結果

10, 3.5
10, abc

問題②

問題② pair の pair を試してみてください。


#include <iostream>
#include <utility>
#include <string>

int main()
{
    typedef std::pair<int, std::pair<std::string, std::string> > NamesPair;

    NamesPair a(0, std::make_pair("Tanaka", "Takuya"));

    std::cout << a.first << ", " << a.second.first << " " << a.second.second << std::endl;
}

実行結果

0, Tanaka Takuya

ID のような整数値と、苗字・名前を管理する pair の pair を想定しています。pair の pair は、型名が非常に長くなるので、typedef を使って簡潔な型名を定義するのがセオリーです。

具体的な型名が必要な箇所が変数の定義時だけなら、C++11 の auto を使って、「auto a = std::make_pair(0, std::make_pair("Tanaka", "Takuya"));」のように書くこともできます。

出力している行を見ると分かるように、「a.second.first」のような、一見して意味が分かりづらい記述になるのが大きな欠点でしょうか。

C++11 では、std::tuple という std::pair を拡張した構造体が追加されています。これは任意の型の N個の要素をまとめて管理できます。3つ以上の要素が必要なら(あるいは2つであっても)std::tuple を使うのが良いです。


参考リンク



更新履歴

'2014/10/19 新規作成。



第3章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー