Data+

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


'코딩 > C&C++' 카테고리의 다른 글

25. STL 변경 가능 시퀀스 알고리즘  (0) 2017.04.21
24. STL 변경 불가 시퀀스 알고리즘  (0) 2017.04.21
22. STL map  (0) 2017.04.20
21. STL hash_map  (0) 2017.04.20
20. STL deque2  (0) 2017.04.19

블로그의 정보

Data+

Qerogram

활동하기