'vector'에 해당되는 글 1건

  1. 2010.08.12 MyVector만들기


#ifndef __MYVECTOR_H
#define __MYVECTOR_H

template <class T>
class MyVector
{
 int cap;  //현재 최대 보관 가능 공간크기
 int usage;   //현재 보관된 개체 수
 T *base;     //개체를 보관할 버퍼 위치

public:
 class iterator //객체 출력자-분석하시오.
 {
  
  friend class MyVector<T>;
  T *pos;
  
    public:
  iterator(T *_pos=0)
  {
   pos = _pos;
  }
  iterator(const iterator &in)
  {
   pos = in.pos;
  }
  operator T*()
  {
   return pos;
  }
  iterator operator++()
  {
   pos++;
   return (*this);
  }
  const iterator &operator++(int)
  {
   static iterator re;
   re.pos = pos;
   pos++;
   return (*this);
  }
 };
 
 //초기화하는 습관을 키운다
// int cap;  //현재 최대 보관 가능 공간크기
// int usage;   //현재 보관된 개체 수
// T *base;     //개체를 보관할 버퍼 위치
 MyVector(int _capacity=0,T data =0)//생성자
 {
  cap=_capacity;
  base=new T[cap];
  usage=0;
  for(int i=0; i<cap; i++)
  {
   base[i]=data;
  }
  //속성 초기화
  //_capacity만큼 버퍼 공간 할당
  //data를 _capacity만큼 보관

 }
 
 virtual ~MyVector()
 {
  delete []base;
 }
 //버퍼가 할당되어 있으면 버퍼를 해제
 
 void push_back(T in)
 {

  if(cap==0)
  {  
   cap=1;
   base=new T[cap];
  }
  else if(usage==cap)
  {
   extend();   //확장하는 것을 private에 함수로 구현했음(extend)
  } 

  base[usage]=in;
  usage++;

 
  //공간이 꽉 찼다면 배열을 cap*2배로 버퍼 증가 후 usage에 값을 저장.
  //(cap==usage)가 참이라면 공간의 여유분이 없음 
  //공간이 남아 있다면 usage에 값을 저장.(base[usage]위치에 data를 보관)
  //usage증가 
 }

 T &operator[](int index)
 {
  if(index>=0 && index<cap)
  {
   return base[index];
   
  }
  //index가 유효하면 버퍼의 index위치 원소 반환
  //예외 발생할 때는 throw
  else
  {
   throw "잘못된 인덱스 접근입니다.";//유효 하지 않다면 오류 메시지 던지기
  }
 }
 
 void clean()
 {
  for(int i=0; i<usage; i++)
  {
   base[i]=0;
  }

  //보관된 개체수를 0으로 reset
  
 }
 
 int size()
 {
  return usage;//보관량
 }
 
 iterator begin()
 {
  iterator re(base);
  return re;
 }
 iterator end()
 {
  iterator re(base+usage);
  return re;
 }
 void insert(iterator it,T in)
 {
  int gap=it-base;  
  
  for(int i=usage; i>=gap; i--)
  {
   base[i+1] = base[i];
  }  

  base[gap]=in;   
  
  //유효한지 확인 int gap=pos-base;
  //gap이 유효하지 않으면 함수 종료
  
  //꽉 찼다면
  //버퍼가 할당되어 있다면
  //cap*2만큼 버퍼 공간 확장
  //아니라면 1만큼 버퍼공간 할당
  //gap위치에서부터 뒤에 보관된 개체를 ShiftRight하여라
  //gap위치에 in을 보관하라

  //usage 증가
  usage++;

 }
 void erase(iterator it)
  {
  int gap=it-base;
  
  base[gap]=0;
  for(int i=gap; i<usage; i++)
  {
   base[i]=base[i+1];
  }
  usage--;

  
  //gap에서부터 윈쪽으로 이동
  //usage 감소
 }
 int capacity()
 {
  return cap; //전체 크기 넘겨주기.
 }
 private:

  void extend()
  {
   T* temp=new T[cap];
  
  for(int i=0; i<usage; i++)
  {
   temp[i]=base[i];
  }
  cap=cap*2;
  delete[] base;
  
  base=new T[cap];
  
  for(i=0; i<usage; i++)
  {
   base[i]=temp[i];
  }
  
   delete[] temp;
  }
 
};


 template <class T>
 MyVector<T>::iterator find(MyVector<T>::iterator &beg,MyVector<T>::iterator &end,T data)
 {
  for( ; beg !=end; ++beg)
  {
   if(*beg == data)
   {
    break;
   }
  }
  return beg;
 }

#endif

'COMPUTER TECH > C, C++' 카테고리의 다른 글

퀵 정렬  (0) 2010.08.12
힙 트리  (0) 2010.08.12
피보나치 수열  (0) 2010.08.12
MyVector만들기  (0) 2010.08.12
최단경로 알고리즘  (0) 2010.08.09
Static Member 와 Const Member  (0) 2010.08.09
Posted by ... XJAPAN
이전버튼 1 이전버튼