언어 자료구조 알고리즘/Escort 자료구조와 STL

[자료구조와 STL] 8. 3 vector를 이용하여 특정 키 순으로 보관하기

언제나휴일 2016. 4. 18. 10:20
반응형

2. 3 vector를 이용하여 특정 키 순으로 보관하기

 

 이번에는 vector를 이용하여 특정 키순으로 보관하는 방법에 대해 살펴보기로 합시다. 삭제나 검색, 전체 보기 등은 차례대로 보관할 때와 같습니다. 단지 보관할 위치를 찾는 논리가 다를 뿐입니다.

 

 특정 키순으로 보관하려면 보관된 시작 위치부터 사용자가 입력한 학생 번호가 더 크거나 같은 위치를 찾아서 해당 위치에 보관해야 할 것입니다. 물론, 같으면 필터링해야겠지요. 이 경우에도 함수 개체만 잘 정의하면 쉽게 사용할 수 있습니다. vector에서 원하는 위치에 보관할 때는 insert 메서드를 사용합니다. insert 메서드를 사용할 때에는 보관할 위치에 해당하는 iterator를 입력 인자로 전달해야 합니다. 그리고 vector 내부에서는 해당 위치에 보관된 원소부터 뒤에 보관된 모든 원소는 한 칸씩 뒤로 밀리게 됩니다. 또한, push_back 메서드처럼 저장소가 꽉 차게 되면 vector 내부에서 저장소의 크기를 갱신시킨 후에 보관하므로 사용하는 개발자는 저장소의 크기를 크게 신경 쓸 필요는 없지요.

 


vector에 insert 메서드 호출 전 후 모습

[그림 6] vector insert 메서드 호출 전 후 모습

 

 //학생의 번호가 멤버 변수 num보다 크거나 같으면 참을 반환하는 함수 개체 클래스

class MoreEqualByNum

{

    int num;

public:

    MoreEqualByNum(int num)

    {

        this->num = num;

    }

    bool operator()(Stu *stu)

    {

        return (stu && stu->GetNum() >= num);

    }

};

 

void StuManager::AddStu()

{

    int num = 0;

    cout<<"추가할 학생 번호를 입력하세요."<<endl;

    num = ehglobal::getnum();

    MoreEqualByNum sbn(num);

    StuIter seek = find_if(base.begin(),base.end(),sbn); //보관할 위치 찾기

    if((seek== base.end())||((*seek)->GetNum() != num)) //없다면

    {

        string name = "";

        cout<<"이름을 입력하세요"<<endl;

        name = ehglobal::getstr();       

        base.insert(seek,new Stu(num,name)); //seek 앞에 보관

    }

    else

    {

        cout<<"이미 존재하는 학생입니다."<<endl;

    }

}

반응형