Table of contents

    1. 정리

    tuple은 편리하면서도 상당한 Output을 내주는 라이브러리입니다. 기존에 pair라는 라이브러리가 있었지만 개수가 2개로 제한되어 있었습니다. 하지만, tuple은 3개 이상의 쌍으로 저장이 가능하고 정렬 또한 엑셀처럼 간단하게 구현할 수 있습니다.

     

    먼저, string과 int 쌍의 tuple로 이루어진 vector에 요소들을 추가해보겠습니다.  선언은 pair로 이루어진 vector와 유사하네요. 추가 또한, 함수명은 달라졌지만 직관적이고 어렵지 않습니다. 아래의 문구를 실행하면, { "TEST_1", 1 }  쌍과 { "TEST_1", 2 } 의 쌍이 추가된 것입니다.

     

    vector<string> answer;
    vector<tuple <string, int>> v;
    	
    //추가
    v.emplace_back("TEST_1", 1);
    v.emplace_back("TEST_2", 2);

     

     

     

    다음은 전체 출력을 해보겠습니다. 일반 for문으로 배열처럼 접근이 가능하고 auto로도 가능합니다. tuple 안의 요소에 접근하는 방법은 get<index>vector 로 가능하네요. c에서 보기 힘든 형태이지만, 가독성을 낮추진 않는 것 같습니다. 이 코드에서는 get<0>은 string get<1>은 int 요소를 의미합니다.

     

    출력은

     

    TEST_1 : 1

     

    TEST_2 : 2

     

    TEST_1 : 1

     

    TEST_2 : 2

     

    로 출력됩니다.

     

    //전체 출력 #1
    for (int i = 0; i < v.size(); i++) {
    	cout << get<0>(v[i]) << " : " << get<1>(v[i]) << endl;
    }
    
    //전체 출력 #2
    for (auto i: v) {
    	cout << get<0>(i) << " : " << get<1>(i) << endl;
    }

     

     

     

    다음은 int 값으로 내림차순하기 위한 함수를 선언해보죠. 인자는 string, int 쌍의 tuple로 받고 int형을 기준으로 내림차순하는 비교함수입니다. 람다형식으로도 정렬이 가능하지만, 보기 좋게 함수로 진행하겠습니다.

     

    bool compare(tuple <string, int> a, tuple <string, int> b) {
    	return get<1>(a) > get<1>(b);	//내림차순
    }

     

     

     

    이제 실제 정렬을 시켜보겠습니다. 벡터의 처음부터 끝까지 compare 함수 기준으로 정려합니다.

     

    //tuple int 값 내림차순
    sort(v.begin(), v.end(), compare);

     

     

     

    다시 한 번, 전체 벡터를 순차적으로 출력해보겠습니다.

     

    출력은

     

    TEST_2 : 2

     

    TEST_1 : 1

     

    처럼 출력됩니다.

     

    짧은 코드로 정말 많은 작업을 해주고 있습니다.

    for (auto i : v) {
    	cout << get<0>(i) << " : " << get<1>(i) << endl;
    }

     

     

     

    tuple을 잘 활용하면, 마치 Excel에서 데이터를 정리하는 것과 같은 느낌이 듭니다. 코드를 구현함에 있어서, 좀 더 직관적인 느낌으로 코딩이 가능하군요. 빅데이터급의 데이터 정리가 아니라면, 처리 속도에서도 크게 나쁘지 않을 듯 합니다.

     

     

    2. 전체코드

    #include <string>
    #include <vector>
    #include <map>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    bool compare(tuple <string, int> a, tuple <string, int> b) {
    	return get<1>(a) > get<1>(b);			//내림차순
    }
    
    void solution(void) {
    	vector<string> answer;
    	vector<tuple <string, int>> v;
    	
    	//추가
    	v.emplace_back("TEST_1", 1);
    	v.emplace_back("TEST_2", 2);
    
    	//전체 출력 #1
    	for (int i = 0; i < v.size(); i++) {
    		cout << get<0>(v[i]) << get<1>(v[i]) << endl;
    	}
    
    	//전체 출력 #2
    	for (auto i: v) {
    		cout << get<0>(i) << get<1>(i) << endl;
    	}
    
    	//tuple int 값 내림차순
    	sort(v.begin(), v.end(), compare);
    
    	//전체출력
    	for (auto i : v) {
    		cout << get<0>(i) << get<1>(i) << endl;
    	}
    
    	return;
    }
    
    int main(void)
    {
    	solution();
    
    	return 0;
    }