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