C++17부터 지원하는 structured binding이란 어떤 배열, STL 같은 컨테이너에서 멤버들을 쉽게 바인딩할 수 있도록 도와주는 문법이다.

친숙한 map을 예시로 들어보자

#include <iostream>
#include <map>

int main()
{
  std::map<int, int> mp;

  for (int i = 1; i < 11; i++)
  {
    mp[i] = i * i;
  }

  // iterator, basic for
  for (std::map<int, int>::iterator it = mp.begin(); it != mp.end(); it++)
  {
    std::cout << it->first << ' ' << it->second << '\\n';
  }

  // auto, enhanced for
  for (auto &i: mp)
  {
    std::cout << i.first << ' ' << i.second << '\\n';
  }

  // structured binding, enhanced for
  for (auto &[k, v]: mp)
  {
    std::cout << k << ' ' << v << '\\n';
  }
}

array의 모든 원소를 가져와보자

#include <iostream>
#include <array>

int main()
{
  std::array<int, 5> ar;
  for (int i = 0; i < 5; ++i) ar[i] = i + 1;
  auto [a, b, c, d, e] = ar;
  std::cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << '\\n';
}

stl 에서 쓰는 것 뿐만 아니라 직접 정의한 구조체에도 사용이 가능하다

#include <iostream>

struct point2d
{
  int x, y;
};

int main()
{
  point2d p;
  p.x = 10, p.y = 2000;

  auto &[a, b] = p;

  a = 200, b = 0;

  std::cout << p.x << ' ' << p.y << '\\n';
}