본문으로 바로가기

[STL]MAP(구조체 활용)

category c++/STL 2021. 1. 23. 00:18

 

먼저 MAP을 잘 모른다면 먼저 밑의 글을 읽고 와주세요

wpgur.tistory.com/73

 

[STL]MAP(기본 개념 및 예시)

중복을 허용하지 않는 key와 관련된 value를 관리하며. 내부적으로 검색 삽입 삭제가 되는 레드 블랙트리를 사용하고있고 MAP의 구조는 다음과 같다. <기본적인 MAP 사용> map 해더 #include 선언하기 map

wpgur.tistory.com

 

개요

코드에 많은 구조체가 존재할때 STL의 map을 사용해 key와 value에 구조체를 넣어 잘 활용할수있다. 이렇게 되면 여러 데이터들을 효율적으로 다룰 수 있는데 여기서 잘 활용을 하기 위해 공부한 내용을 정리하고자 한다.

 

MAP과 STRUCT의 활용

먼저 MAP안에 핵심임 KEY값에 struct(구조체)를 넣게 된다면 KEY값을 탐색을 할수있게 만들어줘야한다.

이진트리인 MAP에서 KEY 탐색을 위해서는 대소비교가 가능해야하는데.

 

operator(연산자 오버라이딩)을 사용해서 <, > 기호를 재정의 함으로서 대소비교가 가능하게 할수 있다.

이과정을 통하면 map, set의 key값으로 class, struct를 사용할 수 있다.

 

struct Info {
    unsigned int heigh;
    unsigned int weight;

    bool operator <(const Info &var) const
        {
            if( heigh != var.heigh){
                return heigh < var.heigh;
            }else{
                return weight < var.weight;
            }
        }
};

 

만약 heigh와 weight를 사용하는 구조체를 key값으로 사용하고 싶다면 heigh를 비교하고 같다면 weight를 비교하는 코드를 생성해주면 오류가 뜨지않고 사용할 수 있다.

 

 

<전체 코드>

학생 키와 몸무게를 구조체로 표현한 코드

#include <iostream>
#include <map>

using namespace std;


struct Info {
    unsigned int heigh;
    unsigned int weight;

	//연산자 오버라이딩-----------------------------------------------------------------------
    bool operator <(const Info &var) const
        {
            if( heigh != var.heigh){
                return heigh < var.heigh;
            }else{
                return weight < var.weight;
            }
        }
};

int main()
{
	//민수 구조체 정의------------------------------------------------------------------------
    Info minsu;
    minsu.heigh=180;
    minsu.weight=80;
    
	//수민 구조체 정의------------------------------------------------------------------------
    Info sumin;
    sumin.heigh=160;
    sumin.weight=50;

	//map 의 key값을 구조체 Info로 설정-------------------------------------------------------
    map<Info,int> student;

	//map에 값을 넣는 방법은 두가지로 표현할 수 있다.------------------------------------------
    student[minsu]=1;
    student.insert(pair<Info,int>(sumin,2));

	//map 내부 값 확인-----------------------------------------------------------------------
    map<Info,int>::iterator iter;
    for (iter = student.begin();iter!=student.end();iter++){
        cout << iter->first.heigh<<" "<<iter->first.weight<<" "<<iter->second<<endl;
    }

    return 0;
}

디버깅 및 출력 결과값 확인

디버깅 값은 for 문을 처음 돌때 들어가 있는 값을 나타낸 것이다.

'c++ > STL' 카테고리의 다른 글

[STL]MAP(기본 개념 및 예시)  (0) 2021.01.22