C++中string类的实现
来源:互联网 发布:ARPU数据展示模版 编辑:程序博客网 时间:2024/06/15 02:38
以下是C++中string类的实现,可能与标准库中的具体实现还有蛮大的差距。以下是源码:
class Wstring{public: int Length; Wstring(const char* p = "") :Length(strlen(p)), str(new char[strlen(p) + 1]){ strcpy(str, p); } Wstring(const Wstring& s) :Length(s.Length), str(new char[s.Length + 1]){ strcpy(str, s.str); } ~Wstring(){ delete[] str; } Wstring& operator = (const char* p); Wstring& operator = (const Wstring& s); Wstring& operator += (const char* p); Wstring& operator += (const Wstring& s); friend ostream& operator << (ostream& ot, const Wstring& s); friend istream& operator >> (istream& it, Wstring& s); friend const Wstring operator + (const Wstring& s, const char* q); friend const Wstring operator + (const char* p, const Wstring& s); friend const Wstring operator + (const Wstring& s1, const Wstring& s2); bool operator == (const char* p); bool operator == (const Wstring& s); bool operator > (const Wstring& s); bool operator > (const char* s); bool operator < (const Wstring& s); bool operator < (const char* s); bool operator >= (const Wstring& s); bool operator >= (const char* s); bool operator <= (const Wstring& s); bool operator <= (const char* s); int indexOf(const Wstring& s, int startPos); int indexOf(const char* p, int startPos); int LastindexOf(const Wstring& s); int LastindexOf(const char* p); Wstring subString(int start, int nCount); Wstring lTrim(); Wstring rTrim(); Wstring Trim(); Wstring Replace(const Wstring& oldStr, const Wstring& newStr,int start,int end); Wstring Replace(const Wstring& oldStr, const char* newStr, int start, int end); Wstring Replace(const char* oldStr, const Wstring& newStr, int start, int end); Wstring Replace(const char* oldStr, const char* newStr, int start, int end); Wstring toUpper(); Wstring toLower(); Wstring padLeft(int len, char ch); Wstring padRight(int len, char ch); Wstring Inverse(int start, int end); int Count(const char* p,int start,int end); int Count(const Wstring& s, int start, int end); bool startWith(const char* p); bool startWith(const Wstring& s); bool endWith(const char* p); bool endWith(const Wstring& s); Wstring Insert(const char* p,int startindex); Wstring Insert(const Wstring& s, int startindex); Wstring toDate(const char* p); const char* tochar();private: char* str;};
const char* Wstring::tochar(){ return str;}bool Wstring::operator > (const Wstring& s){ return strcmp(str, s.str) > 0;}bool Wstring::operator > (const char* s){ return strcmp(str, s) > 0;}bool Wstring::operator < (const Wstring& s){ return strcmp(str, s.str) < 0;}bool Wstring::operator < (const char* s){ return strcmp(str, s) < 0;}bool Wstring::operator >= (const Wstring& s){ return strcmp(str, s.str) >= 0;}bool Wstring::operator >= (const char* s){ return strcmp(str, s) >= 0;}bool Wstring::operator <= (const Wstring& s){ return strcmp(str, s.str) <= 0;}bool Wstring::operator <= (const char* s){ return strcmp(str, s) <= 0;}Wstring& Wstring::operator = (const char* p){ Length = strlen(p); str = new char[Length + 1]; strcpy(str, p); return *this;}Wstring& Wstring::operator = (const Wstring& s){ if (this != &s) { if (str != NULL) delete[] str; Length = s.Length; str = new char[Length + 1]; strcpy(str, s.str); } return *this;}bool Wstring::operator == (const char* p){ return !strcmp(str, p);}bool Wstring::operator == (const Wstring& s){ return !strcmp(str, s.str);}Wstring& Wstring::operator += (const char* p){ /*if (strlen(p)>0) { char* temp = new char[Length + 1]; strcpy(temp, str); delete[] str; str = NULL; Length += strlen(p); str = new char[Length + 1]; strcpy(str, temp); strcat(str, p); delete[] temp; }*/ return *this+=Wstring(p);}Wstring& Wstring::operator += (const Wstring& s){ if (s.Length>0) { char* temp = new char[Length + 1]; strcpy(temp, str); delete[] str; str = NULL; Length += s.Length; str = new char[Length + 1]; strcpy(str, temp); strcat(str, s.str); delete[] temp; } return *this;}const Wstring operator + (const Wstring& s, const char* q){ Wstring tp = s; return tp += q;}const Wstring operator + (const char* p, const Wstring& s){ Wstring tp = p; return tp += s;}const Wstring operator + (const Wstring& s1, const Wstring& s2){ Wstring tp = s1; return tp += s2;}ostream& operator << (ostream& ot, const Wstring& s){ return ot << s.str;}istream& operator >> (istream& it, Wstring& s){ char* temp = new char[100000]; it >> temp; s = temp; return it;}Wstring Wstring::subString(int start, int nCount = 0){ if (start < 0) return ""; Wstring tp = str; if (nCount >= 0) { char* p = tp.str + start; if (nCount == 0) nCount = Length - start + 1; tp.str[(start + nCount) < Length ? start + nCount : Length] = '\0'; tp = p; p = NULL; } else { char* q = start + nCount > 0 ? tp.str + start + nCount : tp.str; tp.str[start] = '\0'; tp = q; q = NULL; } return tp;}int Wstring::indexOf(const Wstring& s, int startPos = 0){ return indexOf(s.str, startPos);}int Wstring::indexOf(const char* p, int startPos = 0){ int len = strlen(p); for (int i = startPos; i <= Length - len; i++) { if (this->subString(i, len) == p) return i; } return -1;}int Wstring::LastindexOf(const Wstring& s){ return LastindexOf(s.str);}int Wstring::LastindexOf(const char* p){ int len = strlen(p); for (int i = Length - len; i >= 0; --i) { if (this->subString(i, len) == p) return i; } return -1;}Wstring Wstring::lTrim(){ int pos = 0; while (str[pos] == ' ') pos++; return subString(pos);}Wstring Wstring::rTrim(){ int pos = Length - 1; while (str[pos] == ' ') --pos; return subString(0, pos+1);}Wstring Wstring::Trim(){ return rTrim().lTrim();}Wstring Wstring::Replace(const Wstring& oldStr, const Wstring& newStr,int start=0,int end=0){ return Replace(oldStr.str, newStr.str, start, end);}Wstring Wstring::Replace(const Wstring& oldStr, const char* newStr, int start, int end){ return Replace(oldStr.str, newStr, start, end);}Wstring Wstring::Replace(const char* oldStr, const Wstring& newStr, int start, int end){ return Replace(oldStr, newStr.str, start, end);}Wstring Wstring::Replace(const char* oldStr, const char* newStr, int start, int end){ Wstring tp = *this; if (end == 0) end = Length - 1; int pos = tp.indexOf(oldStr, start),len=strlen(oldStr),len1=strlen(newStr)-strlen(oldStr); while (pos != -1 && pos+len-1<=end) { tp = tp.subString(0, pos) + newStr + tp.subString(pos + len); end += len1; pos = tp.indexOf(oldStr, pos + strlen(newStr)); } return tp; //return Replace(Wstring(oldStr), Wstring(newStr), start, end);}Wstring Wstring::toUpper(){ Wstring tp=*this; for (int i = 0; i < Length; i++) { if (tp.str[i] >= 'a' && tp.str[i] <= 'z') tp.str[i] -= 32; } return tp;}Wstring Wstring::toLower(){ Wstring tp = *this; for (int i = 0; i < Length; i++) { if (tp.str[i] >= 'A' && tp.str[i] <= 'Z') tp.str[i] += 32; } return tp;}Wstring Wstring::padLeft(int len, char ch = '0'){ if (Length >= len) return *this; char* p = new char[len - Length+1]; /*for (int i = 0; i < len - Length; i++) p[i] = ch;*/ memset(p, ch, len - Length); p[len-Length] = '\0'; return p + *this;}Wstring Wstring::padRight(int len, char ch = '0'){ if (Length >= len) return *this; char* p = new char[len - Length + 1]; memset(p, ch, len - Length); p[len - Length] = '\0'; return *this + p;}Wstring Wstring::Inverse(int start = 0, int end = 0){ if (end == 0) end = Length-1; Wstring tp = *this; char ch; for (int i = 0; i <= (start + end) / 2 -start; i++) { ch = tp.str[start + i]; tp.str[start + i] = tp.str[end - i]; tp.str[end - i] = ch; } return tp;}int Wstring::Count(const char* p, int start=0, int end=0){ if (end == 0) end = Length - 1; int cnt = 0,len=strlen(p); int pos = indexOf(p, start); while (pos != -1 && pos+len-1<=end) { cnt++; pos = indexOf(p, pos + len); } return cnt;}int Wstring::Count(const Wstring& s, int start = 0, int end = 0){ return Count(s.str, start, end);}bool Wstring::startWith(const char* p){ return subString(0, strlen(p)) == p;}bool Wstring::startWith(const Wstring& s){ return subString(0, s.Length) == s;}bool Wstring::endWith(const char* p){ return subString(Length, (-1)*strlen(p)) == p;}bool Wstring::endWith(const Wstring& s){ return subString(Length, (-1)*s.Length) == s;}Wstring Wstring::Insert(const char* p, int startindex){ return subString(0, startindex) + p + subString(startindex);}Wstring Wstring::Insert(const Wstring& s, int startindex){ return subString(0, startindex) + s + subString(startindex);}Wstring Wstring::toDate(const char* p = "yyyy/mm/dd"){ int pos1, pos2,pos=0; while (str[pos] <= '9' && str[pos] >='0') pos++; pos1 = pos; pos++; while (str[pos] <= '9' && str[pos] >='0') pos++; pos2 = pos; pos++; while (str[pos] <= '9' && str[pos] >='0') pos++; Wstring s1 = subString(0, pos1); Wstring s2 = subString(pos1+1, pos2 - pos1-1); Wstring s3 = subString(pos2+1, pos - pos2-1); if (p == "yyyy/mm/dd") return s1 + "/" + s2.padLeft(2, '0') + "/" + s3.padLeft(2, '0'); else if (p == "yyyy/m/d") return s1 + "/" + s2 + "/" + s3; else if (p == "yyyy-mm-dd") return s1 + "-" + s2.padLeft(2, '0') + "-" + s3.padLeft(2, '0'); else return s1 + "/" + s2 + "/" + s3;}
该类基本实现了string类的功能,可能还有些许问题有待改进。
0 0
- [C++]String类的实现
- [C++]String类的实现
- [C++]String类的实现
- C++String类的实现
- 【c++】string类的实现
- C++string类的实现
- C++string类的实现
- C++String类的实现
- C++string类的实现
- C/C++string类的实现
- C++string类的一个实现
- C++string类的简单实现
- c++string类的简单实现
- C++—String类接口的实现
- C语言 string.h 中函数的实现
- 【C/C++】String类实现
- String 中 "+"的实现
- C string buffer的实现
- http中get与post的真正区别
- [leetcode] 314. Binary Tree Vertical Order Traversal 解题报告
- 微信开发配置文件详细注释版
- Linux sudo 命令详解
- Android的IPC机制(五)—— ContentProvider的使用
- C++中string类的实现
- hdu 2033 人见人爱A+B
- iOS-KVO
- Nginx + IIS + Web前端(Spring MVC)——负载均衡(二)
- Linux 常用命令1——ls
- svn账号用户名密码修改
- uva 11889 GCD
- Android studio 创建 java 应用
- 3696: 化合物|树形DP