오븐 노트

[C++] map #2 본문

Develop/C++

[C++] map #2

오 븐 2023. 7. 13. 17:51
#include <iostream>
using namespace std;
#include <vector>
#include <list>
#include <deque>
#include <map>

class Player
{
public:

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

public:
    int _playerId;
};

template<typename T1, typename T2>
struct Pair
{
    T1 t1;
    T2 t2;
};

int main()
{
    // 연관 컨테이너
    
    // map : 균형 이진 트리 (AVL)
    // - 노드 기반

    class Node
    {
    public:
        Node* _left;
        Node* _right;
        // DATA
        pair<int, Player*> _data;
        //int     _key;
        //Player* _value;
    };

    srand(static_cast<unsigned int>(time(nullptr)));
    // (Key, Value)
    map<int, int> m; // map 특성 상 같은 키의 값은 하나만 존재할 수 있음

    //pair<map<int, int>::iterator, bool> ok;
    //ok = m.insert(make_pair(1, 100));
    //ok = m.insert(make_pair(1, 200)); // insert가 중복이면 무시된다.
    //ok.first; // map<int, int>::iterator
    //ok.second; // bool

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

    // 5만명 퇴장
    for (int i = 0; i < 50000; i++)
    {
        int randomValue = rand() % 50000;

        // Erase By Key
        m.erase(randomValue);
    }

    // Q) ID = 1만인 Player 찾고 싶다
    // A) map 자체가 삽입, 삭제 등 찾는 모든 과정이 빠르게 일어나기 때문에 매우 빠르게 찾을 수 있음.
    
    //unsigned int count = 0;
    //count = m.erase(10000);
    //count = m.erase(10000); // erase는 중복 호출 하여도 문제가 되지는 않는다.

    // map 순회

    for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
    {
        pair<const int, int>& p = (*it);
        int key = it->first; // p.first / (*it).first 형태 가능
        int value = it->second;
        
        cout << key << " " << value << endl;
    }

    // 없으면 추가, 있으면 수정
    // 기본값 세팅이 필요치 않을 때
    map<int, int>::iterator findIt = m.find(10000);
    if (findIt != m.end())
    {
        findIt->second = 200;
    }
    else
    {
        m.insert(make_pair(10000, 10000));
    }

    // 없으면 추가, 있으면 수정 v2 (압축 버전)
    m[5] = 500;

    m.clear();

    // [] 연산자 사용 시 주의점
    // 대입을 하지 않더라도 (Key/Value) 형태의 데이터가 추가됨.
    // 기본값 세팅을 해야하거나 해도 상관 없을 때
    for (int i = 0; i < 10; i++)
    {
        cout << m[i] << endl;
    }

    // 넣기   (insert, [])
    // 빼기   (erase)
    // 찾기   (find, [])
    // 반복자 (map::iterator) (*it) pair<key, value>&
    // [] 연산자는 기본값 세팅이 들어감

    return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 연습 문제  (0) 2023.08.31
[C++] set, multimap, multiset  (0) 2023.08.23
[C++] map #1  (0) 2023.07.11
[C++] deque  (0) 2023.06.26
[C++] list #3  (0) 2023.06.09