string 類操作的重載實現及其提供的其他常用成員函數
目錄
- 1,string 類操作的重載實現
- 2,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; }
運行結果如下:
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”
string 類操作的重載實現及其提供的其他常用成員函數