C++ map 자료구조를 활용하는 방법에 대해 알아보자 😚

안녕하세요! 두두코딩 입니다 ✋
오늘은 C++ map 자료구조에 대해 알아보겠습니다.

해당 자료는 강의를 참고해 작성되었음을 알려드립니다.

🖇 소스코드에 마우스를 올리고 copy 버튼을 누를 경우 더 쉽게 복사할 수 있습니다!

궁금한 점, 보안점 남겨주시면 성실히 답변하겠습니다. 😁
+ 감상평 댓글로 남겨주시면 힘이됩니다. 🙇

std::map 사용법

map 자료구조는 STL에서 가장 많이 사용하는 구조이다. map을 사용하기 위해서는 #include<map>을 추가해야한다.

map은 set과 달리 고유한 데이터를 저장하는 것이 아니라 하나의 pair를 저장한다. pair는 단어 그대로, 키값 과 데이터값의 한 쌍을 말한다. map은 pair로 이루어진 set 자료구조라고도 불린다.

map

위의 그림과 같이, pair의 첫번째 값은 key 값이고, 두번째 값은 실제 데이터 값 (value 값이라고도 함)이다. 첫번째 값인 key값을 기준으로 RB트리가 형성되어져 있다.

구조를 알았으니, 사용방법을 알아보자.

🌱 데이터 삽입

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main()
{
	map<string, string> m;

	pair<string, string> p1("월요일", "mon");
	m.insert( p1 );

	m.insert( make_pair("화요일", "tue") );

	m["수요일"] = "wed";
}

위의 코드와 같이, 데이터를 삽입하는 방법은 총 3가지이다.

  1. pair 객체를 만들어서 insert() 사용하기
  2. make_pair를 만들면서 insert() 사용하기
  3. [] index 연산자 활용해서 데이터 넣기

🌱 데이터 검색

#include <iostream>
#include <sring>
#include <map>

using namespace std;

int main()
{
	map<string, string> m;

	m.insert( make_pair("월요일", "mon") );
	m.insert( make_pair("화요일", "tue") );
	m.insert( make_pair("수요일", "wed") );
	m.insert( make_pair("목요일", "thu") );
	m.insert( make_pair("금요일", "fri") );

	auto ret = m.find("일요일");

	if (ret == m.end())
		cout << "fail" << endl;
	else
		cout << ret->first << " " << ret->second;
}

map 자료구조에서 데이터를 찾기 위해서는 find()를 활용한다. find()에 key값을 전달함으로 해당 map 내에 전달된 key 값이 있는지를 확인한다. 만약 없다면 마지막 반복자인 end()를 전달하게 되고, 값이 있을 경우 반복자 (iterator)를 반환한다. iteratorpair를 가리키는 포인터 역할을 하는 객체로 firstsecond를 이용해 key값과 data값을 출력할 수 있다.

🌱 데이터 삭제

#include <iostream>
#include <sring>
#include <map>

using namespace std;

int main()
{
	map<int, string> m;

	m.insert( make_pair(1, "월요일") );
	m.insert( make_pair(2, "화요일") );
	m.insert( make_pair(3, "수요일") );
	m.insert( make_pair(4, "목요일") );
	m.insert( make_pair(5, "금요일") );

	auto ret = m.find(3);
	m.erase(ret);

	m.erase(2);

	auto iter = m.find(4);
	m.erase(iter, m.end());

	for (auto p : m)
		cout << p->first << " " << p->second << endl;
}

위의 코드는 map 내에서 데이터를 제거하기 위한 코드이다. map 내에서 값을 제거하는 방법은 3가지가 존재한다.

  1. 반복자를 전달함으로 삭제
  2. key값에 해당하는 요소 삭제
  3. 범위 지정 삭제 3.1. 범위를 지정하면 시작점 부터 범위의 끝까지 요소를 모두 삭제한다.

위의 코드를 수행해보면, 월요일 만 남아 있을 것이다. 범위 삭제로 목요일 부터 금요일까지 삭제됐기 때문이다.

값 출력시 주의점

map 자료구조에서는 값 출력할 때 주의할 점이 있다. 바로 []연산을 활용한 출력이다. 예시를 통해 알아보자.

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main()
{
	map<string, string> m;

	m.insert( make_pair("월요일", "mon") );
	m.insert( make_pair("화요일", "tue") );

	cout << m["월요일"] << endl; // mon

	// map에 없는 데이터를 찾아버리면..
	cout << m["토요일"] << endl; // 에러가 아니라 ""이 출력됨.
}

위의 코드와 같이, map 자료구조에 없는 데이터를 []연산을 활용하여 출력할 경우이다. 이럴 경우 map에서는 없는 데이터네 하면서 make_pair("토요일", "")를 활용하여 만들어 map 저장한 후 출력한다. 따라서 null 값이 출력된다.

그렇다면, 없는 데이터를 출력하지 못하게 하려면 어떻게 해야할까?

auto ret = m.find("토요일");

if (ret == m.end())
	cout << "fail" << endl;
else
	cout << "I found " << ret->second << endl;

위의 코드와 같이, 바로 findmap 자료구조 내부에 값이 존재하는지를 확인하고 뽑아줘야한다. 일반적으로 작성된 프로그래밍을 보면 보통 map은 값의 존재 유무를 확인하고 출력한다.