이번에 설명할 is_partitioned, partition_point는 그 이름처럼 앞서 소개한 partition_copy와 관계가 있는 알고리즘 입니다.
is_partitioned의 원형
template<class InputIterator, class BinaryPredicate>
bool is_partitioned(
InputIterator _First,
InputIterator _Last,
BinaryPredicate _Comp
);
partition_point의 원형
template<class ForwardIterator, class Predicate>
ForwardIterator partition_point(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Comp
);
is_partitioned는 데이터셋의 요소가 전반 부와 후반 부 두 개로 나누어져 있는지 조사할 때 사용하고, partition_point는 두 개로 나누어져 있는 데이터셋에서 후반 부의 첫 번째 요소를 가리키는 반복자를 반환합니다.
약간 설명이 애매하죠?^^;
예를 들어 설명하면 온라인 FPS 게임에서 8명이 각각 4명씩 레드 팀과 블루 팀으로 나누어서 게임을 하는 경우 vector로 된 StagePlayers(온라인 게임에서 방에 들어온 유저들을 저장)에 앞 부분에는 레드 팀 플레이어 4명을 차례로 저장하고, 그 이후에 블루 팀 플레이어를 저장하고 있는지 조사하고 싶을 때 is_partitioned 알고리즘을 사용하면 알 수 있습니다(맞다면 true를 반환합니다). 그리고 StagePlayers에서 블루 팀의 첫 번째 플레이어에 접근하고 싶다면 partition_point를 사용합니다.
나름 쉽게 설명한다고 했는데 이해 가시나요? 만약 이해가 안 간다면 예제 코드를 봐 주세요^^
< 예제 >
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
struct PLAYER
{
int CharCD;
bool IsRedTeam;
};
int main()
{
vector< PLAYER > StagePlayers1;
PLAYER player1; player1.CharCD = 1; player1.IsRedTeam = true; StagePlayers1.push_back( player1 );
PLAYER player2; player2.CharCD = 2; player2.IsRedTeam = true; StagePlayers1.push_back( player2 );
PLAYER player3; player3.CharCD = 3; player3.IsRedTeam = true; StagePlayers1.push_back( player3 );
PLAYER player4; player4.CharCD = 4; player4.IsRedTeam = false; StagePlayers1.push_back( player4 );
PLAYER player5; player5.CharCD = 5; player5.IsRedTeam = false; StagePlayers1.push_back( player5 );
PLAYER player6; player6.CharCD = 6; player6.IsRedTeam = false; StagePlayers1.push_back( player6 );
PLAYER player7; player7.CharCD = 7; player7.IsRedTeam = false; StagePlayers1.push_back( player7 );
bool IsPartitioned = is_partitioned( StagePlayers1.begin(), StagePlayers1.end(),
[]( PLAYER player ) -> bool { return player.IsRedTeam; } );
if( IsPartitioned ) {
cout << "레드 팀과 블루 팀으로 구분 되어 나누어져 있습니다." << endl;
} else {
cout << "레드 팀과 블루 팀으로 구분 되어 있지 않습니다." << endl;
}
vector< PLAYER >::iterator IterFirstBlueTeamPlayer = partition_point( StagePlayers1.begin(),StagePlayers1.end(),
[]( PLAYER player ) -> bool { return player.IsRedTeam; } );
if( IterFirstBlueTeamPlayer != StagePlayers1.end() ) {
cout << "첫 번째 블루 팀 플레이어. 캐릭터 코드 : " << (*IterFirstBlueTeamPlayer).CharCD << endl;
}
vector< PLAYER > StagePlayers2;
StagePlayers2.push_back( player7 );
StagePlayers2.push_back( player6 );
StagePlayers2.push_back( player1 );
StagePlayers2.push_back( player5 );
StagePlayers2.push_back( player4 );
StagePlayers2.push_back( player3 );
StagePlayers2.push_back( player2 );
IsPartitioned = is_partitioned( StagePlayers2.begin(), StagePlayers2.end(),
[]( PLAYER player ) -> bool { return player.IsRedTeam; } );
if( IsPartitioned ) {
cout << "레드 팀과 블루 팀으로 구분 되어 나누어져 있습니다." << endl;
} else {
cout << "레드 팀과 블루 팀으로 구분 되어 있지 않습니다." << endl;
}
getchar();
return 0;
}
< 결과 >
예제 코드를 보니 쉽게 이해 되시죠? 그럼 저는 아는 걸로 생각하고 다음 포스팀에서는 다른 알고리즘을 설명하겠습니다^^
'C++0x' 카테고리의 다른 글
[STL] 11. <algorithm>에 추가된 새로운 함수들 is_heap, is_heap_until (0) | 2011.05.11 |
---|---|
[STL] 10. <algorithm>에 추가된 새로운 함수들 is_sorted, is_sorted_until (1) | 2011.04.25 |
STL을 아직 공부하지 않으신 분들은 이 글들을 참고하세요 (0) | 2011.04.19 |
[STL] 8. <algorithm>에 추가된 새로운 함수들 - partition_copy (2) | 2011.04.12 |
VC++ 10에 새롭게 추가된 STL. 다시 시작합니다 (0) | 2011.04.11 |