클래스 및 메모리 관리에 대해 좀 더 연습을하려면 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;
}
};
젠체하는 사람,이 웹 사이트에서 올바른 코드 형식을 얻을 수 없다 ... 첫 번째 문은 "#include"이어야하고 "#include " –
hedgehogrider
코드는 4 개의 공백으로 들여 쓰여 있어야합니다. 그게 당신이 필요한 전부입니다. 코드를 붙여 넣은 후에'{}'버튼을 누르십시오. 위와 같은 작업을 통해 코드를 볼 수 있습니다. 다른 방법으로 들여 쓰기를 변경하지 않았으므로 오류가있는 경우 질문을 편집하여 내가 한 것을 수정하십시오. –
할당 연산자에 [copy-and-swap idiom] (http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)을 사용해야합니다. – GManNickG