※ 개인적인 공부를 위해 포스팅 하는 글입니다.
▶ 연관 컨테이너 ◀
간단한 개념 정리 링크: 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 |