2012년 8월 9일 목요일

STL pair 소개

연관있는 2개의 자료를 stl 컨테이너에 보관할때가 있다. 이럴때, 단 2개의 멤버만을 가지는 클래스를 하나 만드는것보다 pair 자료형을 쓰면 훨씬 편하다.

또한 3개까지도 pair<type1, pair<type2, type3> >를 이용하면 편리하다.
물론, 1개에 2개의 속성이 달린 경우에 더욱 직관적일 것이다.
//슬라이드 컨트롤과 그것에 대응하는 값을 페어로 하여 벡터컨테이너에 넣는경우
...
std::vector< std::pair<CSliderCtrl*, float*> > m_vecRelatedBrushWorkArea_;
...
void RegisterBrushWorkArea(CSliderCtrl* _pCtrl, float* _pEditSize)
{
        *_pEditSize = _pCtrl->GetPos()*0.25f;
        m_vecRelatedBrushWorkArea_.push_back(
                std::pair<CSliderCtrl*, float*>(_pCtrl, _pEditSize));
}
...
void SetBrushWorkAreaSize(int _size)
{
        std::vector< std::pair<CSliderCtrl*, float*> >::iterator it
                = m_vecRelatedBrushWorkArea_.begin();
        it->first->SetPos(_size);
        float editSize = it->first->GetPos() * 0.25;
        *(it->second) = editSize;
        static_cast<CWnd*>(it->first)->GetParent()->UpdateData(FALSE);
        it++;
        while( it != m_vecRelatedBrushWorkArea_.end())
        {
                it->first->SetPos(_size);
                *(it->second) = editSize;
                static_cast<CWnd*>(it->first)->GetParent()->UpdateData(FALSE);
                it++;
        }
}

//3개의 요소를 중첩된 pair를 가지고 표현하는 경우
typedef std::vector< std::pair<CSliderCtrl*, std::pair< float*, CString* > > >
        BRUSH_WORK_AREA;
BRUSH_WORK_AREA m_vecRelatedBrushWorkArea_;

m_vecRelatedBrushWorkArea_.push_back(
        std::pair<CSliderCtrl*, std::pair<float*, CString*> >(
                _pCtrl, pair<float*, CString*>( _pEditSize, _pViewSize )
        )
);

first, second는 STL/map에서 자주 보는데, 그것은 맵이 pair를 이용해서 만들어지기 때문이다.
 
출처: http://poksion.cafe24.com/poki/wiki.php/STL/pair

댓글 없음: