2010-12-30 16 views
3

私は、クラスとメモリ管理でもう少し練習をするために、cppでinbuiltベクタクラスを再作成しようとしています。私は 'ISO C++は型なしの' allocator 'の宣言を禁じています。なぜ私の人生の理由を理解できないのですか?私は行方不明のものがありますか?それがあるべきアロケータをどのように宣言しますか?

#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 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

関連する問題