프로그래밍 언어/C & C++ 정리

C++ STL Pair & Map

게임 개발 2023. 4. 10. 10:07

Pair

 

Pair 란?

 

pair 클래스는 사용자가 지정한 2개의 타입의 데이터를 저장하는 데 사용한다.

서로 연관된 2개의 데이터를 한 쌍으로 묶어서 다룰 때 사용하면 편리하다.

 

만약 pair 클래스를 사용하지 않고 코드를 짜야 한다면,

서로 연관된 2개의 데이터를 다룰 때,

구조체를 따로 정의해야 한다.

여간 번거로운 일이 아니기에 pair 클래스를 이용함으로써 서로 다른 2개의

연관된 2개의 데이터를 편리하게 관리가 가능하다.

 

Pair의 헤더파일

 

pair 클래스는 #include<utility> 라는 헤더파일에 존재하는 STL이다.

 

그러나 다음 헤더파일들은 utility 헤더 파일을 포함하는 헤더 파일이다.

 

#include<algorithm> // utility 헤더파일이 포함됨.
#include<vector> // utility 헤더파일이 포함됨.

Pair 클래스의 형태는 다음과 같다

 

template <class T1, class T2> struct pair;

T1, T2는 아래와 같이 접근을 합니다.

T1 : first
T2 : second

 

Pair 함수의 사용법은 다음과 같다.

  • pair<type1,type2> p
    pair 클래스의 객체 p를 생성한다. 객체 이름은 p가 아니어도 상관없다.
pair<int, int> p; // int 타입 데이터 2개를 관리할 수 있는 pair 클래스의 p객체
pair<int, double> p;// int타입과 double 타입 데이터를 한번에 관리할 수 있는 pair 클래스의 p객체
pair<double, double> p;// 각 각의 double 타입 데이터를 한번에 관리할 수 있는 객체
pair<int, char> p;// int 타입과 char타입 테이터를 하나로 묶어서 관리할 수 있는 p객체
  • p.first
    p의 첫번째 인자를 반환합니다.
  • p.second
    p의 두번째 인자를 반환합니다.
  • make_pair(값1, 값2)
    값1, 값2를 한쌍으로 하는 pair를 만들어서 반환합니다.

 

예제 코드

 

#include<iostream>
#include<vector>

using namespace std;

pair<int, double> p;

int main()
{
	p.first = 1; //pair의 첫번째 인자에 접근
    p.second = 2.1; //pair의 두번째 인자에 접근
    
    cout<<"first value: "<<p.first<<endl;
    cout<<"second value: "<<p.second<<endl;
    
    return 0;
}

 

 

Map

 

Map이란?

map은 각 노드가 key와 value 쌍으로 이루어진 트리이다. 특히, 중복을 허용하지 않는다.

따라서 map은 first, second가 있는 pair 객체로 저장되는 데 first-key로 second-value로 저장된다.

C++의 map의 내부 구현은 검색, 삽입, 삭제가 O(logn)레드블랙트리로 구성되어 있다.

 

Map의 기본형태는 다음과 같다.

map <key, value> map1;

 

Map 정렬

map은 자료를 저장할때 내부에서 자동으로 정렬한다.

map은 key를 기준으로 정렬하며 오름차순으로 정렬한다.

만약 내림차순으로 정렬하고 싶은 경우와 같이 사용하면 된다.

map<int, int, greater> map1;

(만약 다른 방법으로, int 데이터를 내림차순으로 정렬하고 싶을 경우,

데이터에 -(마이너스)를 붙여 삽입하여 처리하면 내림차순으로 정렬된다.)

 

Map 사용방법

 

1) 해더 포함

map을 사용하려면 헤더에 #include <map> 처리를 해야 한다.

 

2) map 선언하기

map의 기본 구조는 map<key type, value type> 이름이다.

 

map<string, int> m;

 

3)map에 찾고자 하는 데이터가 있는 지 확인하기 (search)

map에서 데이터를 찾을 때는 iterator을 사용한다.

데이터를 끝까지 찾지 못했을 경우, iterator는 map.end()를 반환한다.

 

if(m.find("Alice") != m.end())
{
	cout << "find" << endl;
}
else {
	cont << "not find" << endl;
}

 

4) map에 데이터 삽입

map은 중복을 허용하지 않는다. insert를 수행할 때, key가 중복되면 insert가 수행되지 않는다.

중복되면 그것은 key의 역할을 제대로 하지 않는다.

 

m.insert({"Cam", 300});

 

5) 반복문 데이터 접근 (first, second)

  • 인덱스 기반 반복문 활용한 예제 
    : 인덱스 기반은 iterator을  활용하여 begin()부터 end()까지 찾는다.
//인덱스기반
for (auto iter = m.begin() ; iter !=  m.end(); iter++)
{
	cout << iter->first << " " << iter->second << endl;
}
cout << endl;
  • 범위 기반 반복문 활용한 예제 
for (auto iter : m) {
	cout << iter.first << " " << iter.second << endl;
}

 

6) map에서 삭제하기

map에서 데이터를 삭제하기 위해 활용할 함수는  erase와 clear입니다.

1. 특정 위치의 요소 삭제

m.erase(m.begin()+2);

 

2. key값을 기준으로 요소 삭제

 

m.erase("Alice");

3. map의 모든 요소 삭제

  • erase 함수로 모든 요소 삭제하기 (map의 begin부터 end까지)

m.erase(m.begin(), m.end());
  • clear 함수로 모든 요소 삭제하기
m.clear();

7) map 사용 구문 ( 삽입, 찾기, 반복문 구현 )

 

#include <iostream>
#include <map>
using namespace std;
map<string, int> mapset;
int main(void) {

	mapset.insert({ "Alice", 100 });
	mapset.insert({ "Bob", 200 });

	if (mapset.find("Alice") != mapset.end()) 
	{
		cout << "find" << endl;
	}
	else {
		cout << "not find" << endl;
	}

	//인덱스기반
	for (auto iter = mapset.begin() ; iter !=  mapset.end(); iter++)
	{
		cout << iter->first << " " << iter->second << endl;
	}
	cout << endl;

	//범위기반
	for (auto iter : mapset) {
		cout << iter.first << " " << iter.second << endl;
	}

	return 0;
}

 

 

 

 

자료참고 https://ya-ya.tistory.com/91