#include <iostream>
#include <memory>//allocator
using namespace std;
class String
{
static allocator<char> alloc;
private:
char *start;
char *first_free;
char *cap;
public:
//默认构造
String(): start(nullptr),first_free(nullptr),cap(nullptr){
cout<<"默认构造"<<endl;}
String(const char*);
size_t size() const {
return first_free-start;
}
size_t capacity() const {
return cap-start;
}
void chk_n_alloc(){
if(size() == capacity())
{
reallocate();
}
}
void free();
void reallocate();
pair<char*,char*> alloc_n_copy(char*,char*);
String& operator =(String&);
char* begin(){
return start;
}
char* end(){
return first_free;
}
void show() {
cout<<start<<endl;
}
};
allocator<char> String::alloc;//不需要加static
//void String::alloc_n_copy(char* b,char* e )
pair<char*,char*> String::alloc_n_copy(char* b,char* e )
{
/*char* newdata=alloc.allocate(e-b);
char* temp=newdata;
for(char* p=b;p!=e;++p)
{
alloc.construct(newdata++,*p);
}
free();//释放旧数组
start= temp;//新数组的首位置
first_free=cap=newdata;*/
char* newdata=alloc.allocate(e-b);
return {newdata,uninitialized_copy(b,e,newdata)};
}
void String::free()
{
if(start)
{
for(char* p=start;p!=first_free;++p)
{
alloc.destroy(p);
}
alloc.deallocate(start,capacity());
}
}
void String::reallocate()
{
size_t oldsize=this->capacity();
size_t newsize =(oldsize)? 2*oldsize:1;
char* newdata=alloc.allocate(newsize);//新分配的内存起始位置
char* p=nullptr;
for(p=newdata;p!=first_free;++p)//旧数组中的元素拷贝到新数组中
{
alloc.construct(p++,*start++);
}
free();//释放旧数组内存
start=newdata;
first_free=p;
cap=newdata+newsize;
}
String& String::operator =(String& rhs)
{
//char* olddata = alloc.allocate(rhs.size());
pair<char*,char*> be = alloc_n_copy(rhs.begin(),rhs.end());
free();
start=be.first;
cap=first_free=be.second;
return *this;
}
String::String(const char* s)
{
//char* p = s;
/*char p[30];
strcpy(p,s);
char* adr=p;
//char* temp=start;
while((*adr)!='\0')
{
chk_n_alloc();
alloc.construct(first_free++,*adr++);
}*/
//方法2
size_t len=sizeof(s);//包含\0的长度
//free();
char* newdata=alloc.allocate(len);
start=first_free=newdata;
cap=newdata+len-1;
first_free=uninitialized_copy(s,s+len,start);
/*size_t len=sizeof(s); 方法1
start=first_free=alloc.allocate(len);
for(size_t i=0;i<len;++i)
{
alloc.construct(first_free++,s[i]);
}
cap=first_free;*/
cout<<"c风格"<<endl;
}
int main(int argc, char *argv[])
{
String s1("asd");
//String s1;
char let[30]="qwe";
String s2(let);
//s1.show();
s2.show();
s2=s1;
s2.show();
return 0;
}