2010-12-30 1 views
3

클래스 및 메모리 관리에 대해 좀 더 연습을하려면 cpp에서 inbuilt vector 클래스를 다시 만들려고합니다. 나는 'ISO C++이'할당 자 없음 '이라는 선언을 금지하고 나 자신의 삶의 이유를 알 수 없다는 오류가 계속 발생합니다. 내가 빠진 것이 있습니까?할당자를 어떻게 선언합니까?

#include <cstddef> 
#include <memory> 

template <class T> 
class myvector{ 
public: 
    typedef T* iterator; 
    typedef const T* const_iterator; 
    typedef size_t size_type; 

    myvector(){ data = avail = limit = 0; } 

    explicit myvector(size_type n, const T& t = T()) { create(n,t); } 

    myvector(const myvector& v){ create(v.begin(), v.end()); } 

    ~myvector() { uncreate(); } 

    myvector& operator=(const myvector& v) 
    { 
     if (&v != this){ 
      uncreate(); 
      create(v.begin(), v.end()); 
     } 
     return *this; 
    } 


    T& operator[](size_type i) { return data[i]; } 
    const T& operator[](size_type i) const { return data[i]; } 

    iterator begin(){ return data; } 
    const_iterator begin() const{ return data; } 

    iterator end(){ return limit; }  
    const_iterator end() const{ return limit; } 

    size_type size(){ return avail - data; } 

    void push_back(T t) 
    { 
     if(avail == limit) 
      size_type new_size = max(2*(limit-data),ptrdiff_t(1)); 
      iterator new_data = alloc.allocate(new_size); 
      iterator new_avail = uninitialized_copy(data,avail,new_data); 
      uncreate(); 
      data = new_data; 
      avail = new_avail; 
      limit = data + new_size; 
     alloc.construct(avail++,t); 
    } 
private: 
    iterator data; 
    iterator avail; 
    iterator limit; 
    allocator<T> alloc; 

    void create(size_type n, const T& t) 
    { 
     data = alloc.allocate(n); 
     limit = avail = data+n; 
     uninitialized_fill(data,limit,t); 
    } 

    void create(const_iterator i, const_iterator j) 
    { 
     data = alloc.allocate(j-i); 
     limit = avail = uninitialized_copy(i,j,data); 
    } 

    void uncreate() 
    { 
     if(data){ 
      iterator it = avail; 
      while(it != data) { alloc.destroy(--it); } 
      alloc.deallocate(data,limit-data); 
     } 
     data = limit = avail = 0; 
    } 
}; 
+0

젠체하는 사람,이 웹 사이트에서 올바른 코드 형식을 얻을 수 없다 ... 첫 번째 문은 "#include "이어야하고 "#include " – hedgehogrider

+1

코드는 4 개의 공백으로 들여 쓰여 있어야합니다. 그게 당신이 필요한 전부입니다. 코드를 붙여 넣은 후에'{}'버튼을 누르십시오. 위와 같은 작업을 통해 코드를 볼 수 있습니다. 다른 방법으로 들여 쓰기를 변경하지 않았으므로 오류가있는 경우 질문을 편집하여 내가 한 것을 수정하십시오. –

+1

할당 연산자에 [copy-and-swap idiom] (http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)을 사용해야합니다. – GManNickG

답변

3

그것은해야한다, std::allocator<T> alloc;는 표준 라이브러리의 모든 네임 스페이스 std 내에 포함되어 있습니다.

+0

아 ... 맞아 ... 나는 그 하나를 놓친 걸 믿을 수 없어, 고마워! – hedgehogrider