#include < algorithm >find의 원형
template첫 번째 파라미터에 찾기를 시작할 반복자 위치, 두 번째 파라미터에 마지막 위치(반복자의 end()와 같이 이 위치의 바로 앞까지 검색함), 세 번째 파라미터에는 찾을 값을 넘깁니다.InputIterator find( InputIterator _First, InputIterator _Last, const Type& _Val );
vector< int > ItemCodes; …….. // ItemCodes 컨테이너의 시작과 끝 사이에서 15를 찾는다. find( ItemCodes.begin(), ItemCodes.end(), 15 );find를 사용하여 캐릭터의 아이템을 검색하는 예제 코드 입니다.
#include< 결과 >#include #include using namespace std; int main() { vector< int > CharItems; CharItems.push_back( 12 ); CharItems.push_back( 100 ); CharItems.push_back( 77 ); vector< int >::iterator FindIter; // CharItems의 처음과 끝에서 12를 찾는다. FindIter = find( CharItems.begin(), CharItems.end(), 12 ); if( FindIter != CharItems.end() ) { cout << "CharItem 12를 찾았습니다." << endl; } else { cout << "CharItem 12는 없습니다" << endl; } // CharItems 두 번째와 끝에서12를 찾는다 // ++CharItems.begin()로 반복자를 한칸 이동 시켰습니다. FindIter = find( ++CharItems.begin(), CharItems.end(), 12 ); if( FindIter != CharItems.end() ) { cout << "CharItem 12를 찾았습니다." << endl; } else { cout << "CharItem 12는 없습니다" << endl; } return 0; }
templatefind와 비교하면 첫 번째와 두 번째 파라미터는 동일합니다. 세 번째 파라미터가 다릅니다. find는 세 번째 파라미터에 찾기 원하는 값을 넘기지만 find_if는 조건자를 넘깁니다.InputIterator find_if( InputIterator _First, InputIterator _Last, Predicate _Pred );
// 컨테이너에 저장할 유저 정의형 struct User { ……. int Money; int MobKillCount; …… }; // 조건자 struct FindBestUser() { ……………………. }; vector< User > Users; …….. find_if( Users.begin(), Users.end(), FindBestUser() );조건자가 있다는 것 이외에는 find_if는 find와 같으므로 조건자 부분만 잘 보시면 됩니다.
#include< 결과 >#include #include using namespace std; struct User { int Money; int Level; }; struct FindMoneyUser { bool operator() ( User& user ) const { return user.Money == ComparMoney; } int ComparMoney; }; 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.ComparMoney = 2000; FindUser = find_if( Users.begin(), Users.end(), tFindMoneyUser ); if( FindUser != Users.end() ) { cout << "소지하고 있는 돈은: " << FindUser->Money << "입니다" << endl; } else { cout << " 유저가 없습니다. " << endl; } return 0; }
template첫 번째 파라미터는 함수의 파라미터로 넘길 시작 위치, 두 번째 파라미터는 함수의 인자로 넘길마지막 위치, 세 번째는 컨테이너의 데이터를 파라미터로 받을 함수입니다.Function for_each( InputIterator _First, InputIterator _Last, Function _Func );
// 함수 객체 struct UpdatePlayTime { ………. }; vector< User > Users; for_each( Users.begin(), Users.end(), UpdatePlayTime );아래는 위에서 예를 들었던 것을 완전한 코드로 구현한 예제 코드입니다.
#include< 결과 >#include #include 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 : " << cout << 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 : " << cout << IterUser->UID << "의 총 플레이 시간: " << IterUser->PlayTime << endl; } return 0; }
template첫 번째 파라미터는 값을 채울 컨테이너의 시작 위치의 반복자, 두 번째는 컨테이너의 마지막 위치의 반복자, 세 번째는 값을 생성할 함수 입니다.void generate( ForwardIterator _First, ForwardIterator _Last, Generator _Gen );
// 값 생성 함수 struct SetUserInfo { ……. }; vector< User > Users(5); generate( Users.begin(), Users.end(), SetUserInfo() );generate 알고리즘의 대상이 되는 컨테이너는 값을 채울 공간이 미리 만들어져 있어야 합니다. 즉 generate는 컨테이너에 데이터를 추가하는 것이 아니고 기존의 데이터를 다른 값으로 변경하는 것입니다.
struct User { int UID; int RaceType; int Sex; int Money; }; struct SetUserInfo { SetUserInfo() { UserCount = 0; } User operator() () { User user; ++UserCount; user.UID = UserCount; user.Money = 2000; if( 0 == (UserCount%2) ) { user.RaceType = 1; user.Sex = 1; user.Money += 1000; } else { user.RaceType = 0; user.Sex = 0; } return user; } int UserCount; }; int main() { vector< User > Users(5); generate( Users.begin(), Users.end(), SetUserInfo() ); char szUserInfo[256] = {0,}; vector< User >::iterator IterUser; for( IterUser = Users.begin(); IterUser != Users.end(); ++IterUser ) { sprintf( szUserInfo, "UID %d, RaceType : %d, Sex : %d, Money : %d", IterUser->UID, IterUser->RaceType, IterUser->Sex, IterUser->Money ); cout << szUserInfo << endl; } return 0; }< 결과 >
templatecopy 사용 방법OutputIterator copy( InputIterator _First, InputIterator _Last, OutputIterator _DestBeg );
vector< 리스트 5. copy 알골리즘 사용 예>vec1; …….. vector vec2; copy( vec1.begin(), vec1.end(), vec2.begin() );
#include< 결과 >#include #include #include
using namespace std; int main() { vector vec1(10); generate( vec1.begin(), vec1.end(), rand ); cout << "vec1의 모든 데이터를 vec2에 copy" << endl; vector vec2(10); copy( vec1.begin(), vec1.end(), vec2.begin() ); for( vector ::iterator IterPos = vec2.begin(); IterPos != vec2.end(); ++IterPos ) { cout << *IterPos << endl; } cout << endl; cout << "vec1의 모든 데이터를 list1에 copy" << endl; list list1(10); copy( vec1.begin(), vec1.end(), list1.begin() ); for( list ::iterator IterPos2 = list1.begin(); IterPos2 != list1.end(); ++IterPos2 ) { cout << *IterPos2 << endl; } return 0; }
template첫 번째 파라미터는 삭제 대상을 찾기 시작할 위치의 반복자, 두 번째 파라미터는 삭제 대상을 찾을 마지막 위치의 반복자, 세 번째 파라미터는 삭제를 할 값입니다.ForwardIterator remove( ForwardIterator _First, ForwardIterator _Last, const Type& _Val );
vector< 리스트 6. remove 사용 예>vec1; ….. remove( vec1.begin(), vec1.end(), 20 );
#include< 결과 >#include #include #include
using namespace std; int main() { vector vec1; vec1.push_back(10); vec1.push_back(20); vec1.push_back(20); vec1.push_back(40); vec1.push_back(50); vec1.push_back(30); vector ::iterator iterPos; cout << "vec1에 있는 모든 데이터 출력" << endl; for( iterPos = vec1.begin(); iterPos != vec1.end(); ++iterPos ) { cout << *iterPos << " " << endl; } cout << endl; cout << "vec1에서 20 remove" << endl; vector ::iterator RemovePos = remove( vec1.begin(), vec1.end(), 20 ); for( iterPos = vec1.begin(); iterPos != vec1.end(); ++iterPos ) { cout << *iterPos << " " << endl; } cout << endl; cout << "vec1에서 20 remove 이후 사용 하지않는 영역 완전 제거" << endl; while( RemovePos != vec1.end() ) { RemovePos = vec1.erase( RemovePos ); } for( iterPos = vec1.begin(); iterPos != vec1.end(); ++iterPos ) { cout << *iterPos << " " << endl; } }
vector로 삭제 후 남은 영역의 반복자 위치를 받은 후::iterator RemovePos = remove( vec1.begin(), vec1.end(), 20 );
while( RemovePos != vec1.end() ) { RemovePos = vec1.erase( RemovePos ); }로 완전하게 제거하고 있습니다.
templatereplace 사용 방법void replace( ForwardIterator _First, ForwardIterator _Last, const Type& _OldVal, const Type& _NewVal );
vector< 리스트 7. replace 사용 예>vec1; …… replace( vec1.begin(), vec1.end(), 20, 30 );
#include< 결과 >#include #include #include
using namespace std; int main() { vector vec1; vec1.push_back(10); vec1.push_back(20); vec1.push_back(20); vec1.push_back(40); vec1.push_back(50); vec1.push_back(30); vector ::iterator iterPos; cout << "vec1에 있는 모든 데이터 출력" << endl; for( iterPos = vec1.begin(); iterPos != vec1.end(); ++iterPos ) { cout << *iterPos << " " << endl; } cout << endl; cout << "vec1의 세 번째 요소부터 20을 200으로 변경" << endl; replace( vec1.begin() + 2, vec1.end(), 20, 200 ); for( iterPos = vec1.begin(); iterPos != vec1.end(); ++iterPos ) { cout << *iterPos << " " << endl; } return 0; }
최신 콘텐츠