C , C++, C#

[C/C++] C++ 17 문법 unpacking(언패킹), 구조체 바인딩

vhxpffltm 2019. 12. 9. 22:20

C/C++로 알고리즘 문제를 풀면서 또는 c++ 코드인데 생소한 부분들을 많이 봐왔을 것이다. 그 중에서 문제를 풀때도 많이 사용되는 C++ 17 문법인 '언패킹(Unpacking)'에 대해 간단하게 알아보자.

 

내용은 간단하다. 다른 언어에서 쓰는 것처럼 '[...]' 를 사용하여 접근할 수 있다.

 

아래의 코드를 보자.

1
2
3
4
5
6
7
int main()
{
    auto ans = make_pair(1,3);
    auto [a, b] = make_pair(1,3); //이와 같이 auto [변수이름,..] 으로 사용가능, 단 VS c++ 17 옵션켜야함
    cout << ans.first << "  " << ans.second << endl;
    cout << a << "  " << b << endl;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

출력은 ' 1,3 ' 으로 동일하게 나온다.

 

make_pair()로 pair 자료형을 만들어서 이것을 auto [변수명, 변수명] 으로 바로 사용할 수 있는 편리한 점이 있다. 이것을 구조체를 사용해서도 만들 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct info{
    unsigned id;
    string name;
    size_t salary;
};
 
int main()
{
        
    info in{ 1,"num",9876 };    
auto[q, w, e] = in;
    info in2{ 2,"string",1000 };
    auto&[A, B, C] = in2;
    in2.name = "char";
    cout << q << "  " << w << "  " << e << endl;
    cout << A << "  " << B << "  " << C << endl;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

출력결과는 직접 해보거나 계산해도 무방하다. &은 참조연산자로 값을 변경할 수 있다.

이것을 사용하면 우리는 .first, .second 와 같은 코드를 편하게 작성할 수 있다.

 

그럼 마지막으로 map 컨테이너를 사용하여 Unpacking을 사용해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
        
    map<string, size_t> mp{        
        {"key1"1000},
        {"key2",2000},
        {"key3",3000},
    };
    for (const auto &[aa, bb] : mp) {
        cout << aa << "   " << bb << endl;
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

Map 컨테이너를 초기화하고 이것을 for문을 사용하여 출력하는 코드이다.

 

for문에 보면 Unpacking을 사용하여 Map을 끝까지 순환하여 aa와 bb를 출력하고 있다. 

반복문 내에서 개별 값에 접근하여 해당 노드들이 구조체 형태의 바인딩 기능을 통해 값을 구하고 있다 라고 생각하면 된다,

 

그리고 이것을 구조체 형태의 바인딩 이라고도 한다.

 

Refernce

http://egloos.zum.com/sweeper/v/3203903

C++17 STL 프로그래밍

 

 

'C , C++, C#' 카테고리의 다른 글

[C/C++] unique_ptr  (0) 2019.12.28
[C/C++] iterator (반복자)  (0) 2019.12.11
[C/C++] #if #elif #endif 조건부 컴파일  (0) 2019.12.04
[C/C++] #define 매크로, #undef, size_t  (0) 2019.12.03
[C/C++] move  (0) 2019.11.14