C++ string 類 部分成員函式實現(實現COW copy-on-write)
阿新 • • 發佈:2019-02-18
雖然標題中說實現了COW,但是事實上是很浪費的,並且命名也很不標準,程式碼也非常小學生,畢竟初學(給自己找藉口.jpg),以後應該還會把這篇找出來認真修改一下的。
Mystring.h:
#pragma once #ifndef _MYSTRING_H_ #define _MYSTRING_H_ #include <iostream> #include <cstring> using namespace std; class Mystring { public: friendostream & operator << (ostream & os, Mystring & s); friendostream & operator << (ostream & os, const Mystring & s); Mystring();//default constructor Mystring(constchar * s); // 用c字串s初始化 Mystring(constMystring& string2);//copy constructor virtual~Mystring();//destructor int size()const; voidappend(const char* s); voidappend(const Mystring& s); char&operator[](int index); char &operator[](int index) const; char*getString() const; booloperator ==(const Mystring & s) const; booloperator !=(const Mystring & s) const; booloperator < (const Mystring & s) const; booloperator > (const Mystring & s) const; booloperator <=(const Mystring & s) const; booloperator >=(const Mystring & s) const; private: char*m_szstring; int m_isize; }; #endif Mystring.cpp #include "Mystring.h" #include <cstring> #include <iostream> #define _SIZE_1000 using namespace std; Mystring::Mystring():m_isize(0) { m_szstring =new char[1]; m_szstring[1]= 1; } Mystring::Mystring(const char * s):m_isize(strlen(s)) { //autos_size = strlen(s); //m_isize =strlen(s); m_szstring =new char[m_isize+1]; m_szstring[m_isize+ 1] = 1;//該屬性屬於當前地址,當前地址只被自己引用 strncpy(m_szstring,s,m_isize); //cout<< "Mystring(const char * s)" << endl; } Mystring::Mystring(const Mystring & string2) { this->m_isize= string2.m_isize; this->m_szstring= string2.m_szstring;//sharing memory m_szstring[m_isize+1]++;//引用數加一 memcpy(this->m_szstring,string2.m_szstring, string2.m_isize+1); //cout<< "Mystring::Mystring(Mystring & string2)" << endl; } Mystring::~Mystring() { //cout<< "Mystring::~Mystring()"<< this->size()<<endl; m_szstring[m_isize+ 1]--; if(!m_szstring[m_isize+1])//如果當前地址引用者等於零,delete { delete[]m_szstring; } } ostream& operator<<(ostream& os, Mystring&s) { for (int i =0; i < s.size(); i++) { os<< s.m_szstring[i]; } return os; } ostream& operator<<(ostream& os, constMystring &s) { for (int i =0; i < s.size(); i++) { os<< s.m_szstring[i]; } return os; } int Mystring::size() const { returnthis->m_isize; } char& Mystring::operator[](int index) { if(m_szstring[m_isize+1]>1) { m_szstring[m_isize+ 1]--; char*temp = new char[m_isize + 1]; strncpy(temp,m_szstring,m_isize); m_szstring= temp; m_szstring[m_isize+ 1] = 1; //cout<< "surprise mf! >v<" << endl; } returnm_szstring[index]; } char& Mystring::operator[](int index) const { returnthis->m_szstring[index]; } char * Mystring::getString() const { returnthis->m_szstring; } bool Mystring::operator==(const Mystring & s) const { if (m_isize!= s.m_isize)return false; return!memcmp(m_szstring,s.m_szstring,m_isize);//strncmp???因為遇到零會停止啊笨蛋!!!! } bool Mystring::operator!=(const Mystring & s) const { return!((*this)==s); } bool Mystring::operator<(const Mystring & s) const { //if(m_isize > s.m_isize) //{ // return false; //}; const int_minLen = m_isize < s.m_isize ? m_isize : s.m_isize; long long_result = memcmp(m_szstring, s.m_szstring, _minLen); if (_result== 0) { returnm_isize < s.m_isize; } else { return_result < 0; } } bool Mystring::operator>(const Mystring & s) const { return(s<(*this)); } bool Mystring::operator<=(const Mystring & s)const { return!(s<(*this)); } bool Mystring::operator>=(const Mystring & s)const { return!((*this)<s); } void Mystring::append(const char * s) { if (s ==NULL) { //cout<< "invalid input" << endl; return; } if(m_szstring) { char*temp = m_szstring; m_szstring= new char[m_isize + strlen(s) + 1]; memcpy(m_szstring,temp, m_isize); temp[m_isize+ 1]--; if(!temp[m_isize + 1]) { delete[]temp; } //m_szstring= temp; memcpy(m_szstring+ m_isize, s, strlen(s)); m_isize= m_isize + strlen(s); m_szstring[m_isize+ 1] = 1; } else { m_isize= strlen(s); m_szstring= new char[m_isize+1]; strcpy(m_szstring,s); m_szstring[m_isize+ 1] = 1; } } void Mystring::append(const Mystring & s) { if(s.m_szstring == NULL) { return; } if(s.m_szstring) { char*temp = m_szstring; m_szstring= new char[m_isize + s.m_isize + 1]; memcpy(m_szstring,temp, m_isize); temp[m_isize+ 1]--; if(!temp[m_isize + 1]) { delete[]temp; } //m_szstring= temp; //delete[]temp; memcpy(m_szstring+ m_isize, s.m_szstring, s.m_isize); m_isize= m_isize + s.m_isize; m_szstring[m_isize+ 1] = 1; } else { this->m_isize= s.m_isize; this->m_szstring= new char[m_isize + 1]; memcpy(this->m_szstring,s.m_szstring, s.m_isize); m_szstring[m_isize+ 1] = 1; } }
犯得一個奇蠢無比的錯誤是,注意到string的一個特點就是不以/0判斷字串的終止,所以用cstring中的函式也要記得這一點,例如strcmp就會因為/0而終止,而影響正常的比較,所以更推薦用memcmp。