Data+

24. STL 변경 불가 시퀀스 알고리즘

by Qerogram

* STL 알고리즘

- 컨테이너 마냥 Generic한 특징을 가지고있다.(일반 배열에도 가능하기 때문이다.)

(헤더 <algorithm>)

* 분류

- 변경 불가 시퀀스 알고리즘(find, for_each 등)

- 변경 가능 시퀀스 알고리즘(copy, generate 등)

- 정렬 관련 알고리즘(merge, sort 등)

- 범용 수치 알고리즘(accumulate 등)


# 변경 불가 시퀀스 알고리즘

1. find

- 컨테이너 반복자(시작점)를 첫번째 인자, 도착점을 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
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main() {
   vector<int> CharItems;
   CharItems.push_back(12);
   CharItems.push_back(100);
   CharItems.push_back(77);
   
   vector<int>::iterator FindIter;
   
   FindIter = find(CharItems.begin(), CharItems.end(), 12);
   if(FindIter != CharItems.end())  cout << "Find!!, "  << *FindIter << endl;
   else cout << "xxx" << endl;
   
   FindIter = find(++CharItems.begin(), CharItems.end(), 12);
   if(FindIter != CharItems.end())  cout << "Find!!, "  << *FindIter << endl;
   else cout << "xxx" << endl;
   
   return 0;
}
 
 
cs

- 결과

Find!!, 12                                                                              
xxx  


2. find_if

- find와 같으나, find는 기본형을, 사용자 정의 타입은 find_if를 통해 해결해야 된다.

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 <algorithm>
#include <vector>
 
using namespace std;
 
struct User{
    int Money;
    int Level;
};
 
struct FindMoneyUser {
    bool operator() (User& user) const { return user.Money == CompareMoney; }
    int CompareMoney;
};
 
int main() {
   vector<User> Users;
   User user1; user1.Level=10; user1.Money=2000;
   User user2; user2.Level=5; user2.Money=-10;
   User user3; user3.Level=20; user3.Money=35000;
   
   Users.push_back(user1);
   Users.push_back(user2);
   Users.push_back(user3);
   
   vector<User>::iterator FindUser;
   FindMoneyUser tFindMoneyUser;
   tFindMoneyUser.CompareMoney = 2000;
   FindUser = find_if(Users.begin(), Users.end(), tFindMoneyUser);
   if(FindUser != Users.end()) cout << "Find !! : " << (*FindUser).Level << endl;
   else cout << "Not Found!" << endl;
   return 0;
}
 
cs

- 결과

Find !! : 10 


3. for_each

- 순차적으로 컨테이너들에 담긴 데이터를 함수의 파라미터로 넘겨서 함수를 실행시키는 알고리즘.

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
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
struct User{
    int UID;
    int PlayTime;
};
 
struct UpdatePlayTime {
  void operator() (User& user){
      user.PlayTime += PlayTime;
  }  
  int PlayTime;
};
 
int main() {
   vector<User> Users;
   User user1; user1.UID = 1; user1.PlayTime = 40000;
   User user2; user2.UID = 2; user2.PlayTime = 0;
   User user3; user3.UID = 3; user3.PlayTime = 25000;
   
   Users.push_back(user1);
   Users.push_back(user2);
   Users.push_back(user3);
   
   vector<User>::iterator IterUser;
   for(IterUser=Users.begin(); IterUser != Users.end(); ++IterUser) {
       cout << "UID : " << IterUser->UID << "의 총 플레이 시간 : " << IterUser->PlayTime << endl;
   }
   cout << endl;
   
   UpdatePlayTime updatePlayTime;
   updatePlayTime.PlayTime = 200;
   
   for_each(Users.begin()+1, Users.end(), updatePlayTime);
   for(IterUser=Users.begin(); IterUser != Users.end(); ++IterUser) {
       cout << "UID : " << IterUser->UID << "의 총 플레이 시간 : " << IterUser->PlayTime << endl;
   }
   cout << endl;
   return 0;
}
 
 
cs

- 결과

UID : 1의 총 플레이 시간 : 40000                                                              
UID : 2의 총 플레이 시간 : 0                                                                  
UID : 3의 총 플레이 시간 : 25000                                                              
                                                                                       
UID : 1의 총 플레이 시간 : 40000                                                              
UID : 2의 총 플레이 시간 : 200                                                                
UID : 3의 총 플레이 시간 : 25200  


* 참고 : Thinking About C++ STL Programming

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

26. STL 정렬 관련 알고리즘  (0) 2017.04.22
25. STL 변경 가능 시퀀스 알고리즘  (0) 2017.04.21
23. STL set  (0) 2017.04.20
22. STL map  (0) 2017.04.20
21. STL hash_map  (0) 2017.04.20

블로그의 정보

Data+

Qerogram

활동하기