23. STL set
by Qerogram* set
- 헤더 #include <set>
- set 사용법 set <key 자료형> 변수명; // set<int> set1;
- Key가 기본일 때, 내림차순 하고 싶다면 map과 같이. set<int, greater<int>> set1;
- Key가 기본이 아니라 Player 클래스를 사용하고, Player의 멤버 중 HP를 비교하여 정렬하고 싶다면 아래와 같이 하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream> #include <set> using namespace std; class Player { public : Player() { } ~Player() { } int m_HP; }; template <typename T> struct HP_COMPARE : public binary_function<T, T, bool> { bool operator() (T& Player1, T& Player2) const { return Player1.m_HP > Player2.m_HP; } }; int main() { set<Player, HP_COMPARE<Player>> set1; return 0; } | cs |
# insert
- pair<iterator, bool> insert(const value_type& Val);를 사용해서 넣는 것을 주로한다.
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> #include <set> using namespace std; int main() { set<int> set1; set1.insert(set1.begin(), 1); cout << *(set1.begin()) << endl; return 0; } | cs |
- 결과
1
- 특정위치에 삽입 후 정렬 여부.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <iostream> #include <set> using namespace std; void print(set<int> set1) { for(set<int>::iterator iterPos = set1.begin(); iterPos != set1.end(); iterPos++) { cout << *iterPos << endl; } cout << endl; } int main() { set<int> set1; set1.insert(10); set1.insert(15); set1.insert(12); set1.insert(2); set1.insert(100); print(set1); set<int>::iterator iterPos = set1.begin(); set1.insert(++iterPos, 90); print(set1); return 0; } | cs |
- 결과
2
10
12
15
100
2
10
12
15
90
100
* iterator 사용.
- begin(), end(), rbegin(), rend() 지원한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> #include <set> using namespace std; void print(set<int> set1) { for(set<int>::iterator iterPos = set1.begin(); iterPos != set1.end(); iterPos++) { cout << *iterPos << endl; } cout << endl; } void reverse_print(set<int> set1) { for(set<int>::reverse_iterator iterPos = set1.rbegin(); iterPos!=set1.rend(); ++iterPos) { cout << *iterPos << endl; } cout << endl; } int main() { set<int> set1; set1.insert(10); set1.insert(15); set1.insert(12); set1.insert(2); set1.insert(100); reverse_print(set1); set<int>::iterator iterPos = set1.begin(); set1.insert(++iterPos, 90); reverse_print(set1); return 0; } | cs |
- 결과
100
15
12
10
2
100
90
15
12
10
2
* 검색
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> #include <set> using namespace std; void print(set<int> set1) { for(set<int>::iterator iterPos = set1.begin(); iterPos != set1.end(); iterPos++) { cout << *iterPos << endl; } cout << endl; } void reverse_print(set<int> set1) { for(set<int>::reverse_iterator iterPos = set1.rbegin(); iterPos!=set1.rend(); ++iterPos) { cout << *iterPos << endl; } cout << endl; } int main() { set<int> set1; set1.insert(10); set1.insert(15); set1.insert(12); set1.insert(2); set1.insert(100); set<int>::iterator iterPos = set1.begin(); set1.insert(++iterPos, 90); set<int>::iterator FindIter = set1.find(10); if(FindIter != set1.end()) cout << *FindIter << endl; return 0; } | cs |
- 결과
10
* 삭제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> #include <set> using namespace std; void print(set<int> set1) { for(set<int>::iterator iterPos = set1.begin(); iterPos != set1.end(); iterPos++) { cout << *iterPos << endl; } cout << endl; } int main() { set<int> set1; set1.insert(10); set1.insert(15); set1.insert(12); set1.insert(2); set1.insert(100); set<int>::iterator iterPos = set1.begin(); set1.insert(++iterPos, 90); set1.erase(10); print(set1); set<int>::iterator FindIter = set1.find(10); if(FindIter != set1.end()) cout << *FindIter << endl; else cout << "10은 없습니다." << endl; set1.clear(); if(set1.empty()) cout << "set이 비었습니다." << endl; return 0; } | cs |
- 결과
2
12
15
90
100
10은 없습니다.
set이 비었습니다.
* 활용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <iostream> #include <functional> #include <set> using namespace std; class Player{ public : Player() {} ~Player() {} int m_Level; }; template <typename T> struct LEVEL_COMPARE : public binary_function<T, T, bool> { bool operator() (const T& Player1, const T& player2) const { return Player1->m_Level > player2->m_Level; } }; int main() { set<Player*, LEVEL_COMPARE<Player*>> PlayerList; Player* pPlayer1 = new Player; pPlayer1->m_Level = 10; Player* pPlayer2 = new Player; pPlayer2->m_Level = 45; Player* pPlayer3 = new Player; pPlayer3->m_Level = 5; Player* pPlayer4 = new Player; pPlayer4->m_Level = 15; PlayerList.insert(pPlayer1); PlayerList.insert(pPlayer2); PlayerList.insert(pPlayer3); PlayerList.insert(pPlayer4); for(set<Player*, LEVEL_COMPARE<Player>>::iterator IterPos = PlayerList.begin(); IterPos!=PlayerList.end(); ++IterPos) { cout << (*IterPos)->m_Level << endl; } cout << endl; for(set<Player*, LEVEL_COMPARE<Player>>::reverse_iterator IterPos = PlayerList.rbegin(); IterPos!=PlayerList.rend(); ++IterPos) { cout << (*IterPos)->m_Level << endl; } cout << endl; set<Player*, LEVEL_COMPARE<Player*>>::iterator FindIter = PlayerList.find(pPlayer4); if(FindIter != PlayerList.end()) { cout << "찾았습니다 : " << (*FindIter)->m_Level << endl; PlayerList.erase(FindIter); } cout << "Total Player Count : " << PlayerList.size() << endl; cout << endl; PlayerList.clear(); if(PlayerList.empty()) cout << "Player가 없습니다." << endl; delete pPlayer4; delete pPlayer3; delete pPlayer2; delete pPlayer1; return 0; } | cs |
- 결과
45
15
10
5
5
10
15
45
찾았습니다 : 15
Total Player Count : 3
Player가 없습니다.
* 과제
- set은 Key를 중복으로 저장할 수 없다. multiset으로 구현하라.
* 참고 : Thinking About C++ STL Programming
블로그의 정보
Data+
Qerogram