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

[자료구조와 STL] 11. vector 만들기 소스 코드

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

vector 만들기 소스 코드


AboutVector.zip


 

//EHVector.h

#pragma once

namespace EHLIB

{

    template<typename T>

    class vector

    {

        T *base; //요소를 보관할 저장소

        size_t bsize; //보관된 요소 개수

        size_t bcapacity; //저장소의 용량

    public:

        class iterator

        {

            T *pos; //요소가 보관된 위치

        public:

            iterator(T *pos=0)

            {

                this->pos = pos;

            }

            T operator *()

            {

                 return *pos; //보관된 요소를 반환

            }

            int operator-(const iterator &iter)

            {

                return pos - iter.pos ;

            }

            iterator &operator++()

            {

                pos++;

                return (*this);

            }

            const iterator operator++(int)

            {

                iterator re(*this);

                pos++;

                return re;

            }

            bool operator !=(const iterator &iter)

            {

                return pos == iter.pos;

            }

            bool operator ==(const iterator &iter)

            {

                return pos == iter.pos;

            }

        };

 

 

 

        vector(size_t init_cnt=0,T t=0)

        {

            base = 0;

            bsize = 0;

            bcapacity = 0;

            reserve(init_cnt); //저장소의 용량을 init_cnt로 만들기

            push_backs(init_cnt,t); //차례대로 t init_cnt개 보관

        }

        ~vector()

        {

            if(base) //저장소가 할당되었을 때

            {

                delete[] base;

            }

        }

        void push_backs(size_t cnt, T t)

        {

            for(size_t n=0; n<cnt; n++)//cnt개수의 t를 차례대로 보관

            {

                 push_back(t);

            }

        }

        void reserve(size_t ncapacity)

        {

            T *temp = new T[ncapacity]; //새로운 저장소를 할당

            if(bsize) //보관된 요소가 있다면

            {

                for(size_t n=0; n<bsize; n++)

                {

                    temp[n] = base[n]; //기존 저장소에 보관된 요소를 새로운 저장소로 복사

                }               

                delete[] base; //기존 저장소를 소멸

            }

            base=temp; //base에 새로운 저장소를 대입

            bcapacity = ncapacity; //새로운 저장소 용량 대입

        }

        void resize(size_t nsize)

        {

            if(nsize>bcapacity) //입력된 새로운 요소의 개수가 저장소보다 크다면

            {

                reserve(nsize); //저장소 용량을 nsize로 늘려줌

            }

            //새롭게 늘어난 요소 개수만큼 차례대로 0을 보관

            for(size_t n=bsize; n<nsize ; n++)

            {

                insert(end(),0);

            }

        }

        void push_back(T t)

        {

            insert(end(),t);

        }

        void insert(iterator at, T t)

        {

            //at의 상대적 위치를 계산

            size_t index = at - base;

 

            //꽉 찼다면 용량을 늘려줌

            if(bsize == bcapacity)

            {

                reserve(bcapacity+10);

            }

            //보관할 위치 뒤에 있는 요소들 뒤로 한 칸씩 이동

            for(size_t n = bsize; n > index; n--)

            {

                base[n] = base[n-1];

            }

            base[index] = t;

            bsize++;

        }

 

        void erase(iterator at)

        {

            //at의 상대적 위치 계산

            int index = at - base;

 

            //삭제할 위치 뒤에 요소들 한 칸씩 앞으로 이동

            for(size_t n = index+1; n < bsize; n++)

            {

                base[n-1] = base[n];

            }

            bsize--;

        }

 

        T &operator[] (size_t index)

        {

            if(index<bsize)

            {

                return base[index];

            }

            throw "잘못된 인덱스를 사용하였습니다.";

        }

 

        iterator begin()

        {

            return base;

        }

        iterator end()

        {

            //주위!!!   마지막 보관된 요소 위치가 아니라 그 다음 위치를 반환함

            return base+bsize;

        }

        size_t size()

        {

            return bsize;

        }

        size_t capacity()

        {

            return bcapacity;

        }

    };

};


반응형