【C++】std::pair, tupleの基本的な使い方

2つの異なる型の値を「組」として保持するpairクラスについて使い方をまとめます. 類似のもので,より一般にN個の異なる型の値を扱うtupleクラスがあるのでこちらについても簡単に紹介します.

pairの使い方

初期化と要素へのアクセス

  • make_pair()というヘルパー関数を用いて初期化
    2つの値の組を設定する.
  • object.first, object.secondで要素へアクセス
#include <iostream>
#include <string>
#include <utility>

using namespace std;

int main() {
  std::pair<int, string> p = std::make_pair(1, "first");  // 
  cout << p.first << endl;  // 1
  cout << p.second << endl;  // "first"

  return 0;
}

vectorと合わせた利用法

例として,名前と年齢の組を複数持つ名簿のようなものを作るケースを考えます. ここではこの名簿をvectorとpairを組み合わせることで実現します(重複がないのであれば,vectorよりもsetを使う方が適切かもしれません). 下記の例では途中でソートする処理を入れています.この場合,ソートはpairの1つ目,2つ目の要素に対して順に作用します.

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

using namespace std;

int main() {
  vector<pair<string, int>> v;
  v.push_back(make_pair("Tom", 15));
  v.push_back(make_pair("Ken", 13));
  v.push_back(make_pair("Alice", 14));
  v.push_back(make_pair("Alice", 16));

  sort(v.begin(), v.end());
  for (auto iter = v.begin(), iter != v.end(); ++iter) {
    cout << "Name: " << *iter.first << " Age: " << *iter.second << endl;
  }

  /*
  Name: Alice Age: 14
  Name: Alice Age: 16
  Name: Ken Age: 13
  Name: Tom Age: 15
  */

  return 0;
}

tupleの使い方

初期化と要素へのアクセス

  • make_tuple()というヘルパー関数を用いて初期化
    pairに似ているが,pairは2つの値の組であったのに対しtupleは任意のN個の値の組を扱うことができる.

  • std::get<i>(object)でi番目の要素へアクセス

以下の例ではtupleにx, y, z座標を格納し,それぞれの座標を表示させる例である.

#include <iostream>
#include <string>
#include <tuple>

using namespace std;

int main() {
  // (x, y, z)座標をtupleで定義
  std::tuple<float, float, float> t = std::make_tuple(1.0, 0.0, -2.0);
  cout << "x: " << get<0>(p) << endl;  // x: 1.0
  cout << "y: " << get<1>(p) << endl;  // y: 0.0
  cout << "z: " << get<2>(p) << endl;  // z: -2.0

  return 0;
}