string引用计数的写时拷贝
来源:互联网 发布:知乎 礼仪的重要性 编辑:程序博客网 时间:2024/05/22 09:41
string的各种实现:
#include <string>class String{public:String(char* str = "") :_str(new char[strlen(str) + 5]) { strcpy(_str+4, str); _str += 4; GetRefCount() = 1; } String(const String& s) :_str(s._str) { GetRefCount()++; }void Swap(String& s){ String* p;p = s._str;s._str = str;str = p;} ~String(){ if(--GetRefCount() == 0) { delete[](_str - 4); }}int& GetRefCount(){ return *((int*)(_str - 4));}String& operator=(String s){ if(_str != s._str){ if(--GetRefCount() == 0) { delete[](_str - 4); } _str = s._str; GetRefCount()++;}return *this;}const char* GetStr(){ return _str;}size_t Size(){ return _size;}size_t Capacity(){ return _capacity;}void PushBack(char ch){if(_size >= _capacity){ Expand(_capacity * 2);} _str[_size++] = ch; _str[_size] = '\0';}void PushBack(const char* str){size_t len = strlen(str) + _size; if(len >= _capacity){ Expand(_capacity * 2);} while(*str) { _str[_size++] = *str; str++; } _str[_size] = '\0';}void PopBack(){ _str[_size - 1] = '\0'; _size--;}void Insert(size_t pos, char ch){if(_size > _capacity){ Expand(_capacity * 2);}int end = _size;while(end >= (int)pos){ _str[end + 1] = _str[end]; end--;}_str[pos] = ch;_size++;}void Insert(size_t pos, const char* str){ if((_size + strlen(str)) > _capacity){ Expand(_capacity * 2);}int len = strlen(str);size_t i = _size;while(i >= pos){ _str[i + len] = _str[i]; i--; }while(*str){ _str[pos] = *str; pos++; str++;}_size = _size +strlen(str);}void Erase(size_t pos, size_t count){size_t len = pos + count; if(len >= _size){ _str[pos] = '\0';}else{ while(_str[len]) { _str[pos] = _str[len]; len++; pos++; } _size -= count; _str[_size] = '\0';}}size_t Find(char ch) const{ if(_str == NULL){ exit(1);}char* cur = _str;while(*cur){ if(*cur == ch){ return (cur - _str);}cur++;}cout<< "字符串中没有此字符"<<endl;system("pause");exit(1);}size_t Find(const char* str) const{ char* cur = _str; char* src = str; if(_str == NULL) { exit(1); } while(*cur) { char* p = cur;while(*src) { if(*p == *src) { p++;src++; } else { break; }} if(*src == '\0') { return sub -_str + 1; } cur++; break; } cout<<"原字符串中没有此字符串"endl; system("pause"); exit(1);}char& operator[](size_t pos){ assret(pos < _size); return _str[pos];}bool operator<(const String& s) const{ for(size_t i = 0; i < _size && i < s._size; ++i){ if(_str[i] < s._str[i]) { return true; } else if(_str[i] > s._str[i]) { return false; }} if(i == _size && i < s._size) { return true; } else { return false; }}bool operator<=(const String& s) const{ return !(_str >s._str);}bool operator>(const String& s) const{ for(size_t i = 0; i < _size && i < s._size; ++i){ if(_str[i] > s._str[i]) { return true; } else if(_str[i] < s._str[i]) { return false; }} if(i < _size && i == s._size) { return true; } else { return false; } }bool operator>=(const String& s) const{ return !(_str <s._str;}bool operator==(const String& s) const{ for(size_t i = 0; i < _size && i < s._size; ++i){ if(_str[i] > s._str[i]) { return false; } else if(_str[i] < s._str[i]) { return false; }} if(i == _size && i == s._size && _str[_size] == s.str[s._size]) { return true; } else { return false; }}bool operator!=(const String& s)const{ return !(_str == s._str);}void Expand(size_t n){ if(n > _capacity) { _str = (char*)realloc(_str, n+1); assert(_str); _capacity = n; }}
阅读全文
0 0
- String-引用计数的写时拷贝
- string引用计数的写时拷贝
- (String)引用计数写的拷贝
- string类的引用计数的写时拷贝分析
- String--引用计数写时拷贝
- string类的写时拷贝与引用计数
- String类引用计数的写时拷贝
- string类的写时拷贝与引用计数
- String类的浅拷贝、深拷贝、引用计数、写时拷贝
- 小结 | C++ String类的引用计数的浅拷贝、写时拷贝
- 引用计数的写时拷贝
- 引用计数的写时拷贝
- 引用计数的写时拷贝
- String类---深拷贝,简洁深拷贝,引用计数拷贝,写时拷贝
- 引用计数+写时拷贝
- 引用计数写时拷贝
- 引用计数写时拷贝
- 引用计数写时拷贝
- 智能化链表c语言
- Lua元表与元方法详解(转)
- Hyperopt中文文档:Cite引用
- poj 3321 Apple Tree(dfs序+树状数组)
- 朴素贝叶斯-后验概率最大化
- string引用计数的写时拷贝
- android之微信分享文本
- Ubuntu 16.04 安装 GitLab
- Hyperopt中文文档:FMin
- 2
- ENVI遥感图像监督分类与出图制作
- 数据结构--学期总结
- leetcode:Two Sum
- hyperopt中文文档:Installation-Notes安装说明