C++ pair 사용하여 쌍으로 값저장, vector를 사용한 예

 

 

 

 

Pair<[Type], [Type] > 이란?

 

- 2개의 각각 지정한 타입의 값을 저장한다.

 

- 저장한 값은 .first 와 .second로 각각 접근할 수 있다.

 

- 2개의 연관된 값을 같이 저장할 수 있어서 관리를 용이하게 할 수 있다.

 

- 특히, 연관된 2개의 값에서 각각의 조건에 따라 정렬한 결과를 얻고자 할 때 사용하면 좋다. 

( 즉, 2개의 정렬 조건으로 정렬을 하고 싶을 때)

 

 

 

 

 

 

[ 코 드 ]

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

bool comp(pair<int, double> a, pair<int, double> b) {
    if (a.second == b.second) a.first < b.first;
    return a.second > b.second;
}

int main() {
    vector<int> v;
    int N = 8;
    pair< int, int> test = make_pair(1, 2);
    vector<pair<int, double>> vv;
    v.push_back(1);
    v.push_back(3);
    v.push_back(2);
    v.push_back(1);
    v.push_back(0);
    
    for (int i = 0; i < v.size(); i++) {
        vv.push_back(make_pair(i + 1, (double)v[i] / N));
        N -= v[i];
    } // (1, 0.125) (2, 0.4285) (3, 0.5) (4, 0.5) (5, 0) 순으로 데이터가 있다.
	

    sort(vv.begin(), vv.end(), comp); // 2번째 값이 큰 순으로, 1번째 값이 작은 순으로 정렬을 한다.
    
    for (int i = 0; i < vv.size(); i++) {
        cout << vv[i].first << " " << vv[i].second << "\n";
    }

	return 0;
}

 

- 14라인 : pair변수를 선언하고 값을 할당한다. 값을 줄 때는 make_pair( 값1, 값2)를 사용해준다.

 

- 15라인 : vector의 pair타입을 사용하여 선언함으로써 pair 변수를 저장할 수 있게 한다.

 

- 23라인 : pair 타입을 저장하는 vector이므로 make_pair을 사용해 주어서 값을 저장하고 있다.

 

 

 

 

 

 

[ 결 과 ]

 

 

 

- 결과를 보면 2번째 값에 따라서 내림차순 정렬이 되며, 2번째 값이 같을 경우 1번째 값에 따라 오름차순 정렬이 되었다.

 

 

 

 

 

C++ vector 오름차순, 내림차순으로 정렬하기

 

 

 

 

 

sort() 함수

 

- 사용하기 위해서는  #include <algorithm>  을 해주어야 한다.

 

- 디폴트(기본)적으로 오름차순으로 정렬을 해준다.

 

- 내림차순으로 정렬을 하고자 하거나 특정 조건에 따라서 정렬을 하고자 할 때는 비교함수를 만들어서 인수로 주어야 한다.

( 비교함수명은 본인이 지정하면 된다. )

 

- 비교함수는 리턴형은 bool 형으로 매개변수들의 타입은 정렬하는 vector의 저장하는 값의 타입을 준다.

 

- sort() 함수는 퀵 솔트(Quick sort)으로 구현되어 있어 빠른 속도로 정렬을 한다. 

 

- sort() 함수를 사용한다면 일반적인 배열또한 정렬할 수 있다.

 

 

 

 

[ 코 드 ]

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

bool comp(int a, int b) {
    return a > b;
}

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(7);
    v.push_back(8);
    v.push_back(1);
    v.push_back(5);
    
    for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << " 정렬 전\n\n";

    sort(v.begin(), v.end());   // 오름차순 정렬

    for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << " 오름차순 정렬 후\n\n";

reverse(v.begin(), v.end());	// 1. 내림차순 정렬 (오름차순정렬 후 같이 사용)
    sort(v.rbegin(), v.rend());		// 2. 내림차순 정렬 ( rbegin()과 rend()를 사용)
    sort(v.begin(), v.end(), comp); // 3. 내림차순 정렬 (비교함수를 사용)

    for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
    cout << " 내림차순 정렬 후\n\n";

	return 0;
}

 

 

- 23라인 : 추가적으로 비교함수를 인수를 주지 않았다. 그러므로 디폴트 값인 오름차순으로 정렬이 된다.

 

 

※ 

- 28라인 : reverse 함수는 뜻 그대로 반대로 뒤집는다. 그래서 이를 오름차순으로 정렬한 후 사용한다면 내림차순으로 정렬한 것과 같은 결과를 얻을 수 있다.

( reverse 함수또한 사용하기 위해서는 #incldue <algorithm> 을 해주어야 한다.

 

- 29라인 : 오름차순 정렬할 때는 인수로 v.begin(), v.end()를 주었었다. 하지만 이대신 v.rbegin(), v.rend()를 주면 내림차순으로 정렬이 된다. ( r은 아마 reverse )

 

- 30라인 : 추가적으로 비교함수를 인수로 주었다. 비교 함수에서 준 조건에 따라 내림차순으로 정렬이 된다. 이 방법은 굳이 내림차순 정렬만이 아니라 특정 조건에 따라서 정렬을 하고자 할 때 사용할 수 있다.

 

 

 

 

 

[ 결 과 ]

 

 

결과를 보면 각각 오름차순과 내림차순으로 각각 잘 정렬된 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

+ Recent posts