1. 程式人生 > >string 類操作的過載實現及其提供的其他常用成員函式

string 類操作的過載實現及其提供的其他常用成員函式

目錄

@

1,string 類操作的過載實現

/*
string 類操作的過載實現
*/

class CMyString
{
public:
    CMyString(char *ptr = NULL)
    {
        if (ptr == NULL)
        {
            mpStr = new char[1];
            *mpStr = '\0';
        }
        else
        {
            mpStr = new char[strlen(ptr) + 1];
            strcpy(mpStr, ptr);
        }
    }
    ~CMyString()
    {
        delete[]mpStr;
        mpStr = NULL;
    }
    CMyString(const CMyString &src)
    {
        mpStr = new char[src.length() + 1];
        strcpy(mpStr, src.mpStr);
    }
    CMyString& operator=(const CMyString &src)
    {
        if (this == &src)
        {
            return*this;
        }
        delete[]mpStr;
        mpStr = NULL;
        mpStr = new char[src.length() + 1];
        strcpy(mpStr, src.mpStr);
        return *this;
    }
    bool operator>(const CMyString&src){ return strcmp(mpStr, src.mpStr) > 0; }
    bool operator<(const CMyString&src){ return strcmp(mpStr, src.mpStr) < 0; }
    bool operator==(const CMyString&src){ return strcmp(mpStr, src.mpStr) == 0; }
    bool operator!=(const CMyString&src){ return strcmp(mpStr, src.mpStr) != 0; }
    char operator[](int index)
    {
        return  mpStr[index];
    }
    int length()const{ return strlen(mpStr); }
    const char* c_str()const{ return mpStr; }

    // 定義當前CMyString型別的迭代器
    class iterator
    {
    public:
        iterator(char *ptr = NULL) :_ptr(ptr){}

        /*iterator(char *ptr = NULL, int pos = 0)
        {
            _ptr = _ptr + pos;
        }*/

        // 建構函式  operator!=   operator++   operator*
        bool operator!=(const iterator &it)
        {
            return _ptr != it._ptr;
        }
        void operator++()
        {
            _ptr++;
        }
        char& operator*() 
        {
            return *_ptr;
        }
    private:
        // 迭代器的成員變數
        char *_ptr;
    };
    iterator begin(){ return iterator(mpStr); }  // return第0號位元素的迭代器表示
    iterator end(){ return iterator(mpStr + length()); } // return最後一位元素的迭代器表示

private:
    char *mpStr;

    friend CMyString operator+(const CMyString &lhs,const CMyString &rhs);
    friend ostream& operator<<(ostream&out, const CMyString&src);
    friend istream& operator>>(istream&in, CMyString&src);

};

CMyString operator+(const CMyString &lhs, const CMyString &rhs)
{
    char*ptmp = new char[lhs.length() + rhs.length() + 1];
    strcpy(ptmp, lhs.mpStr);
    strcat(ptmp, rhs.mpStr);
    CMyString tmp(ptmp);
    delete ptmp;
    return tmp;
}
ostream& operator<<(ostream&out, const CMyString&src)
{
    out << src.mpStr << endl;
    return out;
}
istream& operator>>(istream&in, CMyString&src)
{
    char buff[1024] = {0};
    in >> buff;
    delete[]src.mpStr;
    src.mpStr = new char[strlen(buff) + 1];
    strcpy(src.mpStr, buff);
    return in;
}
// operator<<   operator>>
int main()
{
    CMyString str1;
    CMyString str2 = "aaa";
    CMyString str3 = "bbb";
    CMyString str4 = str2 + str3;
    cout << str4 << endl;
    str4 = str2 + "ccc";
    cout << str4 << endl;
    str4 = "ddd" + str2;
    cout << str4 << endl;
    cout << "請輸入一段字串:";
    cin >> str4;
    cout << "你輸入的字串是:" << str4 << endl;

    if (str2 > str3)
    {
        cout << "str2 > str3" << endl;
    }
    else
    {
        cout << "str2 <= str3" << endl;
    }

    int size = str4.length();
    for (int i = 0; i < size; ++i)
    {
        cout << str4[i];
    }
    cout << endl;

    char buffer[1024] = { 0 };
    strcpy(buffer, str4.c_str());
    cout << "buffer:" << buffer << endl;

    CMyString testStr = "hello world";
    CMyString::iterator it = testStr.begin(); // begin()返回第0個元素的迭代器
    for (; it != testStr.end(); ++it)// testStr.end()返回最後一個元素的後繼位置
    {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

執行結果如下:

1541412659629

2,String類提供的其他常用成員函式

string s1="ABCDEFG";

string s2="0123456123";

(1)substr(n1,n):取子串函式,從當前字串的n1下標開始,取出n個字元。

如:“s=s1.substr(2,3)”的結果為 :s="CDE";

(2)swap(s):將當前字串與s交換。

如:”s1.swap(s2) “ 的結果為:s1="0123456123"

​ s2="ABCDEFG"

(3)size()/length():計算當前字串中目前存放的字元個數。

如:“s1.length()”的結果為:“ 7”

(4)find(s):在當前字串中查詢子串s,若找到,就返回s在當前字串中的起始位置;若沒找到,返回常數:string::npos。

如:“s1.find("EF")”的結果為:“4”

(5)rfind(s):同find,但從後向前進行查詢。

如:”s1.rfind("BCD")“的結果為:”1“

(6)find_first_of(s):在當前串中查詢子串s第一次出現的位置。

如:“s2.find_first_of("123")”的結果為:“1”

(7)find_last_of(s):在當前串中查詢子串s最後一次出現的位置。

如:“s2.find_last_of("123")”的結果為:“9”

(8)replace(n1,n,s):替換當前字串中的字元,n1是替換的起始下標,n是要替換的字元個數,s是用來替換的字串。

如:“ s1.replace(0,3,abc)”的結果為:“ abcDEFG”

(9)replace(n1,n,s,n2,m):替換當前字串中的字元,n1是替換的起始下標,n是要替換的個數,s是用來替換的字串,n2是s中用來替換的起始下標,m是s中用於替換的字元個數。

如“s1.replace(2,3,s2,2,3) ”的結果為:“ s1=AB234FG”

(10)insert(n,s):在當前串的下標位置n之前,插入s串(此時應考慮當前串的記憶體大小,,若插入後的記憶體大小小於當前串的記憶體大小,則插入失敗)。

如:“ s2.insert(3,"abc")"” 的結果為:“ s2=012abc3456123”

(11)insert(n1,s,n2,m):在當前串的n1下標之後插入s串,n2是s串中要插入的起始下標,m是s串中要插入的字元個數(此時應考慮當前串的記憶體大小,若插入後的記憶體大小小於當前串的記憶體大小,則插入失敗)。

如:“s2.insert(2,"abcdef",1,3) ”的結果為:“s2=01bcd23456123”