(C++) Map

Posted by : at

Category : Cpp


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

public:
    int _playerId;
};

int main()
{
    vector<Player*> v;

    // 10만명 입장
    for(int i = 0; i < 100000; i++)
    {
        Player * p = new Player(i);
        v.push_back(p);
    }

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

        Player* p = v[radIndex];
        delete p;

        v.erase(v.begin() + radIndex);
    }

    // Q) ID = 10,000인 Player를 찾고싶다면???
    // For문을 돌려야하나?? -> 비효율적...
}
  • map : 균형 이진 트리(AVL)으로 구성되어 있다.
    • AVL : 자신보다 큰 값은 왼쪽 작은 값은 오른쪽 등의 규칙으로 트리를 만듦.
// 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 < 500000; i++)
{
    int randomValue = rand() % 50000;

    m.erase(randomValue);
}

// Q) ID = 10000 인 아이템을 찾기
// A) 빠르게 찾아진다.

map<int, int>::iterator findit = m.find(10000);
if(findit != m.end())
{
    cout << "Found" << endl;
}
// erase 팁
unsigned int count = 0;
count = m.erase(1000);      // 1 : 데이터가 있었는데 삭제됨
count = m.erase(1000);      // 0 : 데이터가 없어서 삭제못함.
// insert 주의사항
m.insert(make_pair(1, 100));
m.insert(make_pair(1, 200));        // 기존에 key가 존재하기에 데이터가 들어가지 않음
// 이걸 확인할 순 없나?

pair<map<int, int>:iterator, bool> ok;
ok = m.insert(make_pair(1, 100));
ok = m.insert(make_pair(1, 200));

if(ok.second)
{
    // 삽입성공
}
// 없으면 insert 있으면 수정
map<int, int>::iterator findit = m.find(1000);
it(findid != m.end())
{
    // 찾음
    findit-second = 200*1000;
}
else
{
    // 못찾음
    m.insert(make_pair(1000, 100*1000));
}

// 다른 방법은?
m[5] = 500; // 없으면 넣고, 있으면 수정해달라
// 단, []연산자를 쓰면 무조건 데이터가 추가되기에 주의해야한다.
// 순회
for(map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
{
    pair<const int, int>& p = (*it);
    int key = p.first;      // it->first
    int value = p.second;   // it->second

    cout << key << " " << value << endl;
}

multimap

  • 중복 key를 허용
multimap<int, int> mm;

mm.insert(make_pair(1, 100));
mm.insert(make_pair(1, 200));
mm.insert(make_pair(2, 100));
mm.insert(make_pair(2, 200));

// mm[1] = 500;    // 막혀있음.

mm.erase(1);        // key가 여러개더라도 다 삭제됨
// (2, 100) (2, 200) 만 남음

unsigned int count = mm.erase(1);

multimap<int, int>::iterator itFind = mm.find(1);
if(itFind != mm.end())
{
    // 찾음
}

pair<multimap<int, int>::iterator, multimap<int, int>::iterator> itPair;
itPair = mm.equal_range(1);
// 이렇게도 쓸 수 있음.
// multimap<int, int>::iterator itBegin = mm.lower_bound(1);
// multimap<int, int>::iterator itEnd = mm.upper_bound(1);
for(multimap<int, int>::iterator it = itPair.first; it != itPair.second; ++it)
{
    cout << it->first << " " << it->second << endl;
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links