728x90
728x90
pair(페어)와 tuple(튜플)

pair(페어)
개념
- 사용자가 지정한 2개의 타입의 데이터를 저장하기 위해 사용되는 클래스
- 서로 연관된 2개의 데이터를 한 쌍으로 묶어서 다룰 때 사용하면 편리하다.
- 구조체(struct) 대신 편리하게 2개의 데이터를 관리할 수 있다.
헤더 파일
- 페어(pair)를 사용하려면 다음의 헤더를 불러와야 한다.
#include <utility>
- 하지만, <vector>, <algorithm> 헤더를 사용할 경우, <utility> 헤더가 포함되어 있어 따로 불러와 주지 않아도 된다.
#include <vector> // <utility> 헤더 포함 #include <algorithm> // <utility> 헤더 포함
형태
- 페어(pair)의 형태는 다음과 같다.
template <class T1, class T2> struct pair;
- T1에 첫 번째 인자를, T2에 두 번째 인자를 넣어주면 된다.
사용 방법
초기화
- 다음과 같이 페어(pair)를 초기화할 수 있다.
pair<int, int> p1(3, 12); // C++ 스타일 pair<int, int> p2 = { 3, 12 }; // C 스타일
- 또는 다음과 같이 .first, .second 를 이용하여 초기화할 수도 있다.
pair<int, int> p3; p3.first = 3; p3.second = 12;
- 또는 다음과 같이 make_pair() 함수를 이용해 선언과 초기화를 분리할 수 있다.
pair<int, int> p4; p4 = make_pair(3, 12); // p의 첫 번째 인자와 두 번째 인자에 2와 3을 넣어준다.
- 페어(pair)의 인자의 자료형은 서로 동일하지 않아도 된다.
pair<int, int> p1; pair<int, double> p2; pair<double, double> p3; pair<string, int> p4;
원소 접근
- 페어 클래스의 첫 번째 인자에 접근하려면 .first를, 두 번째 인자에 접근하려면 .second를 변수명 뒤에 붙여준다.
pair<int, int> p; p.first = 3; // 첫 번째 인자에 대입 p.second = 12; // 두 번째 인자에 대입 cout << p.first << endl; // 첫 번째 인자 출력 cout << p.second << endl; // 두 번째 인자 출력
다른 컨테이너와 함께 사용
- 다음과 같이 벡터(vector) 컨테이너와 함께 사용할 수 있다.
vector<pair<string, int>> user1; user1 = make_pair("Kim", 38); vector<pair<string, int>> user2; user2.first = "Park"; user2.second = "17";
- 벡터(vector)와 같은 컨테이너와 함께 사용할 경우, 가독성을 위해 다음과 같이 사용할 수 있다.
typedef pair<int, int> p; // pair<int, int>를 p로 별칭 부여 vector<p> v; // vector<pair<int, int>> v; 와 동일한 표현
사용 예
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool Compare(pair<int, int> a, pair<int, int> b) { if (a.second == b.second) { // y좌표가 같으면 return a.first < b.first; // x 좌표를 오름차순으로 정렬 } return a.second < b.second; // y좌표가 증가하는 순으로 정렬 } int N, x, y; vector<pair<int, int>> xy; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N; for (int i = 0; i < N; i++) { cin >> x >> y; xy.push_back({x, y}); } sort(xy.begin(), xy.end(), Compare); for (auto i : xy) { cout << i.first << " " << i.second << '\n'; } return 0; }
tuple(튜플)
개념
- 튜플(Tuple)은 '사물의 유한한 순서'를 의미하며, 파이썬 등 다양한 언어에서 2개 이상의 값들을 정리할 때 사용된다.
- 사용자가 지정한 2개 이상의 타입의 데이터를 저장하기 위해 사용되는 클래스이다.
- 서로 연관된 2개 이상의 데이터를 한 쌍으로 묶어서 다룰 때 사용하면 편리하다.
- C++11부터 사용 가능하다.
헤더 파일
- 튜플(tuple)을 사용하려면 다음의 헤더를 불러와야 한다.
#include <tuple>
형태
template <class... Types> class tuple;
사용 방법
초기화
- 다음과 같이 튜플(tuple)을 초기화할 수 있다.
tuple<string, int, char> t1("Kim", 26, 'M'); // C++ 스타일 tuple<string, int, char> t2 = { "Park", 22, 'F' }; // C 스타일
- 또는 다음과 같이 make_tuple() 함수를 이용해 선언과 초기화를 분리할 수 있다.
tuple<string, int, char> t1; t1 = make_tuple("Kim", 26, 'M');
원소 접근
- get<>() 함수를 이용해 원소에 접근할 수 있다.
get<접근할_원소의_인덱스>(접근할_튜플의_이름)
tuple<string, int, char> t1("Kim", 26, 'M'); cout << get<0>(t1) << endl; // Kim cout << get<1>(t1) << endl; // 26 cout << get<2>(t1) << endl; // M
원소 분해
- tie() 함수를 이용해 튜플의 원소를 각각의 변수에 분해하여 초기화 해줄 수 있다.
- 이 때, 자료형을 맞추어 주지 않으면 에러가 발생한다.
tuple<string, int, char> t1("Kim", 26, 'M'); string name; int age; char gender; tie(name, age, gender) = t1; // t1의 원소들을 각각 name, age, gender 변수에 대입 cout << name << endl; // Kim cout << age << endl; // 26 cout << gender << endl; // M
2개의 튜플 연결
- tuple_cat() 함수를 이용하여 서로 다른 2개의 튜플을 연결할 수 있다.
- 이 때, 두 튜플을 연결한 데이터를 저장할 새로운 튜플의 자료형은 프로그래머가 맞춰 주어야 한다.
tuple<int, int> t1(1, 2); tuple<int, int> t2(3, 4); tuple<int, int, int, int> t3 = tuple_cat(t1, t2); // t1 튜플과 t2 튜플을 연결하여 t3 튜플 생성 cout << get<0>(t3) << endl; // 1 cout << get<1>(t3) << endl; // 2 cout << get<2>(t3) << endl; // 3 cout << get<3>(t3) << endl; // 4
- t3의 자료형처럼 자료형을 일일이 맞춰주기 번거로우면 auto 키워드를 사용하면 된다.
auto t3 = tuple_cat(t1, t2);
서로 다른 튜플의 변경
- swap() 함수를 사용하면 서로 다른 2개의 튜플을 스왑할 수 있다.
- 단, 변경 하고자 하는 두 튜플의 자료형은 모두 일치해야 한다.
tuple<int, int> t1(1, 2); tuple<int, int> t2(3, 4); cout << get<0>(t1) < endl; // 1 cout << get<1>(t1) < endl; // 2 cout << get<0>(t2) < endl; // 3 cout << get<1>(t2) < endl; // 4 t1.swap(t2); // t1 튜플과 t2 튜플을 서로 스왑 cout << get<0>(t1) < endl; // 3 cout << get<1>(t1) < endl; // 4 cout << get<0>(t2) < endl; // 1 cout << get<1>(t2) < endl; // 2
사용 예
#include <iostream> #include <vector> #include <tuple> using namespace std; using myVector = vector<tuple<int, int, int>>; int N, weight, height, rate; myVector body; void BruteForce(myVector v) { for (int i = 0; i < v.size(); i++) { for (int j = 0; j < v.size(); j++) { if ((get<0>(body[i]) < get<0>(body[j])) && (get<1>(body[i]) < get<1>(body[j]))) { get<2>(body[i])++; } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N; rate = 1; for (int i = 0; i < N; i++) { cin >> weight >> height; body.push_back({ weight, height, rate }); } BruteForce(body); for (auto i : body) { cout << get<2>(i) << " "; } return 0; }
728x90
728x90
'Programming > C++' 카테고리의 다른 글
[C++] set(집합) (0) | 2022.11.08 |
---|---|
[C++] multimap(멀티 맵) (0) | 2022.11.08 |
[C++] unordered_map (0) | 2022.11.08 |
[C++] map(맵) (0) | 2022.11.08 |
[C++] lower_bound(), upper_bound() ; 이진 탐색(Binary Search) (0) | 2022.11.01 |
[C++] sort 함수를 이용하여 오름차순/내림차순 정렬하는 방법 (0) | 2022.10.27 |
[C/C++] 현재 날짜/시간 원하는 형태로 출력하기 (0) | 2022.10.20 |
[C++] bits/stdc++.h (1) | 2022.10.18 |