C++ 개념 정리

15. std::map

CE : 하랑 2026. 1. 17. 22:53

 

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