C++프로그래밍/자료구조,알고리즘(추후확장)

map

season97 2024. 9. 30. 11:52

※ 개인적인 공부를 위해 포스팅 하는 글입니다.


▶ 연관 컨테이너 ◀

 

간단한 개념 정리 링크: https://season97.tistory.com/34

 

STL

▶  STL이란? ㆍ STL은 Standard Templae Library의 약자로 C++의 표준 라이브러리중 하나 ㆍ다양한 데이터구조와 알고리즘을 템플릿으로 제공하는 라이브러리 ㆍ stl은 크게 컨테이너, 반복자, 알고리

season97.tistory.com

 

만약 vector를 이용해서 id기반으로 Player를 찾는다고 생각해 보자...

class Player
{
public:
    Player(int playerId) : _playerId(playerId) {}

    int _playerId;
};


int main()
{
    vector<Player*> v;
    for (int i = 0; i < 10000; i++)
    {
        Player* p = new Player(i);
        v.push_back(p);
    }

    for (int i = 0; i < 5000; i++)
    {
        int randIndex = rand() % v.size();
        Player* p = v[randIndex];
        delete p;
        v.erase(v.begin() + randIndex);
    }

    bool found = false;
    for (int i = 0; i < v.size(); i++)
    {
        if (v[i]->_playerId == 10000)
        {
            found = true;
            break;
        }
    }
}

ㆍ 딱봐도 별로다... 시퀀스컨테이너들은 탐색이 비효율적인 것 같다.

 

 

# map : 자가균형 이진 트리 (AVL) (자세한 내부 개념은 추후 포스팅)

ㆍ 노드 기반으로 무언가 이루어져 있다.

class Node
{
public:
    Node* _left;
    Node* _right;

    int _key;
    Player* _value;
    // pair<int, Player*> _data;
};

ㆍ 간단히 뭐 이런 느낌일 것 같다.

ㆍ pair란 데이터 2개를 묶어주는 그런친구다 make_pair를 이용하자

 

int main()
{
    // key  Value
    map<int, int> m;

    for (int i = 0; i < 100000; i++)
    {
        m.insert(pair<int, int>(i, i * 100));
    }

    for (int i = 0; i < 50000; i++)
    {
        int randomValue = rand() % 50000;

        m.erase(randomValue);
    }
}

ㆍ 삽입 삭제는 이런식으로! 

    //m.find(10000); //키값이 1만인 애를 찾겠다.
    map<int, int>::iterator findIt = m.find(10000);
    if (findIt != m.end()) //이게 못찾았다면? 이라는 뜻
    {
        cout << "찾음" << endl;
    }
    else
    {
        cout << "ㄴㄴ" << endl;
    }

ㆍ find를 이용해서 서칭도 가능하다.

 

# 같은 키를 대상으로 insert나 erase를 했다면?

ㆍ 두번 하면 두번째껀 씹힘! 키에 값을 바꾸고싶다면 key로 접근해서 value를 수정해 주는 식으로 해야한다 

 

 

#map 순회

    for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
    {
        pair<const int, int>& p = (*it);
        int ket = p.first;
        int value = p.second;
    }

ㆍ 맵의 이터레이터는 pair로 key와 value를 반환한다. 위 코드와같이 키와 벨류에 접근할 수 있다.

 

 

# 없으면 추가, 있으면 수정?

    map<int, int>::iterator findIt = m.find(10000);
    if (findIt != m.end())
    {
        findIt->second = 200;
    }
    else
    {
        m.insert(make_pair(10000, 10000));
    }

근데 좀 귀찮다...

m[10000] = 200;

ㆍ 이렇게 간단하게도 된다! 근데 주의점이 있다

 

 

# [] 연산자를 사용할 떄 주의사항

 

ㆍ 대입을 하지 않더라도 (key,value) 형태의 데이터가 추가된다

무슨 소리냐?

   m.clear();
   for (int i = 0; i < 10; i++)
   {
       cout << m[i] << endl;
   }

ㆍ 이렇게 사용하는 순간 m의 키 10번까지는 0이 추가가 된다... [] 연산자는 없으면 추가된다는게 defalt로 깔려있기 때문이다.

'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글

자주 쓰이는 알고리즘  (0) 2024.10.01
연관 컨테이너  (1) 2024.10.01
deque  (0) 2024.09.30
list 구현해보기  (1) 2024.09.29
list와 list의 이터레이터  (0) 2024.09.29