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;
}