C++ map 자료구조를 활용하는 방법에 대해 알아보자 😚
안녕하세요! 두두코딩 입니다 ✋
오늘은 C++ map 자료구조에 대해 알아보겠습니다.
해당 자료는 강의를 참고해 작성되었음을 알려드립니다.
🖇 소스코드에 마우스를 올리고 copy 버튼을 누를 경우 더 쉽게 복사할 수 있습니다!
궁금한 점, 보안점 남겨주시면 성실히 답변하겠습니다. 😁
+ 감상평 댓글로 남겨주시면 힘이됩니다. 🙇
std::map 사용법
map
자료구조는 STL에서 가장 많이 사용하는 구조이다. map
을 사용하기 위해서는 #include<map>
을 추가해야한다.
map
은 set과 달리 고유한 데이터를 저장하는 것이 아니라 하나의 pair
를 저장한다. pair
는 단어 그대로, 키값 과 데이터값의 한 쌍을 말한다. map
은 pair로 이루어진 set 자료구조라고도 불린다.
위의 그림과 같이, 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가지이다.
- pair 객체를 만들어서
insert()
사용하기 - make_pair를 만들면서
insert()
사용하기 []
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)를 반환한다. iterator
는 pair
를 가리키는 포인터 역할을 하는 객체로 first
와 second
를 이용해 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가지가 존재한다.
- 반복자를 전달함으로 삭제
- key값에 해당하는 요소 삭제
- 범위 지정 삭제 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;
위의 코드와 같이, 바로 find로 map
자료구조 내부에 값이 존재하는지를 확인하고 뽑아줘야한다. 일반적으로 작성된 프로그래밍을 보면 보통 map
은 값의 존재 유무를 확인하고 출력한다.