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