partition_copy 알고리즘은 하나의 집단에서 서로 다른 두 개의 집단으로 나눌 때 사용하는 것이라고 아주 간단하게 말할 수 있습니다.
partition_copy
template<class InputIterator, class OutputIterator1, class OutputIterator2, class Predicate>
pair<OutputIterator1, OutputIterator2>
partition_copy(
InputIterator _First,
InputIterator _Last,
OutputIterator1 _Dest1,
OutputIterator2 _Dest2,
Predicate _Pred
);
데이터셋의 _First와 _Last 사이에 있는 각 요소 x를 조건자 _Pred에 인자를 넘겼을 때 true를 반환하면 x는 _Dest1에, false를 반환하면 _Dest2에 복사하고 지정된 구간의 모든 요소를 다 처리하면 OutputIterator 값을 pair로 반환한다
그럼 좀 더 쉽게 이 알고리즘을 어떤 경우에 사용하는지 알 수 있도록 간단한 예제를 하나 보여드리겠습니다.
예) 게임 아이템들을 팔 수 있는 것과 팔 수 없는 것으로 나누어라
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
struct ITEM
{
int nItemCode;
bool bEnableSell;
};
int main()
{
vector< ITEM > AllItems;
ITEM item1; item1.nItemCode = 1; item1.bEnableSell = false; AllItems.push_back( item1 );
ITEM item2; item2.nItemCode = 2; item2.bEnableSell = true; AllItems.push_back( item2 );
ITEM item3; item3.nItemCode = 3; item3.bEnableSell = true; AllItems.push_back( item3 );
ITEM item4; item4.nItemCode = 4; item4.bEnableSell = false; AllItems.push_back( item4 );
ITEM item5; item5.nItemCode = 5; item5.bEnableSell = true; AllItems.push_back( item5 );
ITEM item6; item6.nItemCode = 6; item6.bEnableSell = false; AllItems.push_back( item6 );
ITEM item7; item7.nItemCode = 7; item7.bEnableSell = true; AllItems.push_back( item7 );
ITEM UnItem; UnItem.nItemCode = 0;
list< ITEM > SellItems( 7, UnItem );
list< ITEM > UnSellItems( 7, UnItem );
pair<list< ITEM >::iterator, list< ITEM >::iterator > SeperateItems;
SeperateItems = partition_copy( AllItems.begin(), AllItems.end(),
SellItems.begin(),
UnSellItems.begin(),
[]( ITEM& item ) { return item.bEnableSell; } );
cout << "팔 수 있는 아이템" << endl;
for each( ITEM item in SellItems )
{
if( item.nItemCode <= 0 ) {
continue;
}
cout << "아이템 코드 : " << item.nItemCode << endl;
}
cout << endl << endl;
cout << "팔 수 없는 아이템" << endl;
for( auto Iter = UnSellItems.begin(); Iter != UnSellItems.end(); ++Iter )
{
if( Iter->nItemCode <= 0 ) {
continue;
}
cout << "아이템 코드 : " << Iter->nItemCode << endl;
}
getchar();
return 0;
}
< 결과 >
partition_copy를 사용할 때 한 가지 주의할 점은 결과를 다른 컨테이너에 복사를 하므로 해당 컨테이너에 공간이
확보되어 있어 있어야 합니다. 그래서 위의 예제에도
list< ITEM > SellItems( 7, UnItem );
list< ITEM > UnSellItems( 7, UnItem );
로 더미 값을 넣어서 복사할 공간을 확보하고 있습니다.
참조 : http://msdn.microsoft.com/ko-kr/library/ee384416.aspx
'C++0x' 카테고리의 다른 글
[STL] 9. <algorithm>에 추가된 새로운 함수들 is_partitioned, partition_point (1) | 2011.04.19 |
---|---|
STL을 아직 공부하지 않으신 분들은 이 글들을 참고하세요 (0) | 2011.04.19 |
VC++ 10에 새롭게 추가된 STL. 다시 시작합니다 (0) | 2011.04.11 |
[STL] 7. <algorithm>에 추가된 새로운 함수들 copy_if, copy_n, find_if_not (3/5) (0) | 2010.10.25 |
RValue Reference에 의한 STL의 성능향상 테스트 (0) | 2010.10.18 |