C++ 스탠다드 라이브러리 (std) 안에 있는 스탠다드 템플릿 라이브러리(stl)에 포함된 연관 컨테이너이며, 트리 구조에 기본적으로 탐색에 특화된 자료구조 입니다.
std::Map을 사용하는 경우는 특정 키값을 통해 오브젝트를 관리해 해당 키를 통해 value값을 얻어올 때 사용합니다.
트리의 기본적인 단점
- 편향트리가 생길수가 있다는 것이다.
-> 레드블랙 알고리즘은 스핀이라는 알고리즘을 통해 트리의 균형을 잡아준다.
-> 레드블랙 자가균형 2진 트리라고 한다.
개수가 많아지면 많아질수록 맵을 순회돌리는건 효율적인 일 X
std::map<int(key), int(value)> -> 템플릿이 두개
first -> Key -> 알고리즘 적용 범위는 Key에만 해당
second -> value
삽입 추가 (방법 3가지)
test.insert(std::pair<std::string, A*>("One", a)); // insert (pair) 방식
test.insert(std::make_pair("two", a1)); // insert (make_pair) 방식
test["three"] = a2; // 배열 연산자 방식
Map에서 특정 키 찾는 방법
(1) find
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::map<int,bool> numMap;
for (int i = 0; i < 5; i++)
{
numMap[i] = true;
}
std::map<int, bool>::iterator FindIter = numMap.find(2);
if (FindIter != numMap.end())
{
std::cout << "Key : " << FindIter->first << std::endl;
}
}

(2) Contains
// C++20에서만 사용가능
if (true == NewMap.contains(15))
{
int a = 0;
// 있다.
}
(3) erase -> 노드 삭제
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <string_view>
class A
{
public:
void test()
{
std::cout << "ㅎㅇㄹ" << "\n";
}
};
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
std::map<std::string, A*> testMap;
std::vector<std::string> FName;
FName.push_back("a");
FName.push_back("b");
FName.push_back("c");
for (int i = 0; i < 3; i++)
{
A* test = new A();
testMap[FName[i]] = test;
}
if (true == testMap.contains("b"));
{
delete testMap["b"];
testMap["b"] = nullptr;
testMap.erase("b"); // 노드 삭제
}
for (std::pair<std::string, A*> formap : testMap)
{
formap.second->test();
// safe 메모리 정리 RangeFor에서 순서 잘못해서 삭제하면 터짐 명심해서 하게 -> 중간에 삭제하는 걸 권장하지 않음
//delete formap.second; -> 릭은 안남음 -> 메모리는 삭제한거 같은데
//formap.second = nullptr; // 가리키는 주소값이 nullptr이 안됨 ㅠㅡㅠ -> 권장 안함
}
std::map<std::string, A*>::iterator startIter = testMap.begin();
std::map<std::string, A*>::iterator EndIter = testMap.end();
for (; startIter!=EndIter; ++startIter)
{
delete startIter->second; // 릭 안남고
startIter->second = nullptr; // 가리키는 주소 nullptr 처리 -> for문중에 erase하지말라는거 (노드 삭제)
}
sizeof(testMap);
testMap.clear(); // 노드 다 정리
int bb = 0;
}'C++ 개념 정리' 카테고리의 다른 글
| 17. 컨테이너 (0) | 2026.01.18 |
|---|---|
| 16. std::list (0) | 2026.01.18 |
| 14. string_view (0) | 2026.01.17 |
| 13. iterator (0) | 2026.01.17 |
| 12. std::vector (0) | 2026.01.17 |