#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
using namespace std;

int get_first(const std::pair<int, int> p) { return std::get<0>(p); }

int main() {
  std::vector<int> items;
  std::vector<std::pair<int, int>> pairs;

  pairs.push_back(std::make_pair(1, 3));
  pairs.push_back(std::make_pair(5, 7));

  // With custom function.
  std::transform(pairs.begin(), pairs.end(), std::back_inserter(items),
                 get_first);

  // With std::get<0>, but this is super nasty. :(
  std::transform(pairs.begin(), pairs.end(), std::back_inserter(items),
                 (const int& (*)(const std::pair<int, int>&))std::get<0>);

  // With lambda; it's not much better.
  std::transform(pairs.begin(), pairs.end(), std::back_inserter(items),
                 [](const std::pair<int, int>& p) { return std::get<0>(p); });

  std::copy(items.begin(), items.end(),
            std::ostream_iterator<int>(std::cout, " "));
  cout << endl;

  return 0;
}