写时拷贝的方式实现基本的String类
来源:互联网 发布:如何使淘宝排名靠前 编辑:程序博客网 时间:2024/05/29 17:01
写时拷贝copy_on_write的方式实现基本的String类,从字面意思来讲就是在需要修改字符串的时候将其拷贝一份,然后进行修改。这里引入了引用计数的概念,在写时拷贝时我们需要注意以下几个问题:
1.开始开辟空间时会多开辟4个字节,是引用计数存放的空间,数据从4个字节以后开始存放;
2.在进行重新写入时,如果引用计数为1那么只需要修改即可,不用再进行拷贝;如果引用计数大于1,在修改时才需要重新拷贝一份;
3.再释放空间时,千万要记得连引用计数那块4个字节的空间一起delete.
下面给出用写时拷贝的方式实现基本String类的代码:
#include<iostream>#include<cstring>#include<assert.h>using namespace std;class String{friend ostream& operator<<(ostream& os,const String& s);public:String(const char* str=""):_str(new char[strlen(str)+1+4]){_str=_str+4; //找到数据存放的地方(数组前面4个字节是引用计数的空间)GetCount()=1;strcpy(_str,str);}String(const String& s):_str(s._str){++GetCount();}~String(){if(--GetCount()==0){delete[] (_str-4); //连存放引用计数那块空间一起释放}}String& operator=(String& s){if(this!=&s){if(--GetCount()==0){delete[] (_str-4);}++s.GetCount();_str=s._str;}return *this;}char& operator[](int index){assert(index>=0); //表达式为真,继续执行下面的assert(index<(int)strlen(_str));if(GetCount()>1){--GetCount();char* tmp=new char[strlen(_str)+1+4]; //tmp临时变量,出作用域自行销毁strcpy(tmp+4,_str);_str=tmp+4;GetCount()=1;}return _str[index];}private:char* _str;int& GetCount() //引用计数{return *((int*)_str-1);}};ostream& operator<<(ostream& os,const String& s){os<<s._str<<endl;return os;}void test1(){String s1("hello world");String s2(s1);String s3;s3=s1;cout<<s1<<endl;cout<<s2<<endl;cout<<s3<<endl;}void test2(){String s1("work");s1[3]='d';cout<<s1<<endl;}int main(){test2();system("pause");return 0;}
0 0
- 写时拷贝的方式实现基本的String类
- 写时拷贝的方式实现C++中string类
- c++ String 类的简单实现和写时拷贝
- string类的写时拷贝
- String类的写时拷贝
- String类的写时拷贝
- String类的写时拷贝
- string的写时拷贝
- String类的拷贝(浅拷贝,深拷贝,写时拷贝)
- 模拟实现String类---->写时拷贝
- C++ string类的隐式共享写时拷贝的实现及设计要点
- C++ string类的隐式共享写时拷贝的实现及设计要点
- String类的自我认知(浅拷贝、深拷贝、写时拷贝)
- String类的浅拷贝、深拷贝、引用计数、写时拷贝
- 面试题:String类的浅拷贝、深拷贝、写时拷贝
- string类的引用计数的写时拷贝分析
- string类的简单实现(写时拷贝Copy-on-write)
- string的写时拷贝分析
- 【计算机网络-9】【第三章】广域网
- B/S 和 C/S
- Struts值栈与Ognl
- 单源最短路径算法-Dijkstra
- Java String类
- 写时拷贝的方式实现基本的String类
- 51NOD 1491 黄金系统 && Codeforces 458 A. Golden System(斐波那契数列 + 找规律)
- tHINKpHP认识---文件了解
- test
- Docker入门
- 【计算机网络-10】【第四章】网络层
- Android之蓝牙startDiscovery()搜索不到设备
- Java数组
- 关于JavaScript的定时器的基础和应用